2013-05-16 21 views
1

比方说,我有两个阵列,如:numpy的形状方法返回错尺寸

a = array([ 0.36981727, 0.06066488, 0.73031016]) 

b = array([[ 0.12375904, 0.11647815, 0.56665118], 
     [ 0.9421819 , 0.58797789, 0.26831203], 
     [ 0.25769 , 0.02517343, 0.76701222]]) 

其中a每个元素对应于B的一个阵列。现在,为了排序“一”,同时也跟踪其相应向量的b我做的:

ziped_and_sorted = np.array(sorted(zip(a,b), key=operation.itemgetter(0), reverese =True),'object') 

然后我需要再次拆分a和b,因此:

a = ziped_and_sorted[:,0] 

In [158]: a 
Out[158]: array([0.369817272838, 0.0606648844006, 0.730310164248], dtype=object) 

b = ziped_and_sorted[:,1] 

In [157]: b 
Out[157]: 
array([[ 0.12375904 0.11647815 0.56665118], 
     [ 0.9421819 0.58797789 0.26831203], 
     [ 0.25769  0.02517343 0.76701222]], dtype=object) 

的问题是b.shape返回(3,)而不是(3,3)。这很重要,因为我需要与b进行矩阵乘法运算,并且问题导致出现dimension mismatched错误。

P.S:如果您有更好的解决方案,请提出建议。

回答

3

这是因为b是ndarray的ndarray,而不是2-dim ndarray。

您可以使用numpy.argsort迅速做到这一点:

import numpy as np 
a = np.random.randint(0, 100, 5) 
b = np.random.randint(0, 5, (5, 5)) 
print a 
print b 
idx = np.argsort(a)[::-1] 
print a[idx] 
print b[idx] 

输出为:

[27 65 8 19 32] 

[[4 4 1 4 4] 
[1 3 4 3 3] 
[3 4 2 1 0] 
[1 0 1 0 4] 
[1 4 1 1 4]] 

[65 32 27 19 8] 

[[1 3 4 3 3] 
[1 4 1 1 4] 
[4 4 1 4 4] 
[1 0 1 0 4] 
[3 4 2 1 0]] 

,如果你想使用sorted可以使用numpy.vstack数组列表转换为2-暗黑破坏神:

ziped_and_sorted = sorted(zip(a,b), key=operator.itemgetter(0), reverse=True) 
np.vstack([row[1] for row in ziped_and_sorted]) 
+0

谢谢,只是为了好奇心,如何解决问题的形状?没有任何循环 – Moj

+0

而不是'idx = np.argsort(a)[:: - 1]'你也可以做'idx = np.argsort(-a)'' – askewchan