2016-02-05 84 views
3

我有两个,numpy阵列,第一个,A,一维,第二个,B,是在应用程序我想到的二维,但真的可以有任何维度。 B的每个索引涵盖了与A的单个索引相同的范围。排序一个NumPy数组并排列另一个与它

现在,我想对A进行排序(按降序排列),但想排列B以及它的每个维度。从数学上讲,如果P是排序A的置换矩阵,我想根据np.dot(P, np.dot(B, P.T))转换B。例如。考虑这个例子排序巧合的是对应于反向排序:

In [1]: import numpy as np 

In [2]: A = np.array([1,2,3]) 

In [3]: B = np.random.rand(3,3); B 
Out[3]: 
array([[ 0.67402953, 0.45017072, 0.24324747], 
     [ 0.40559793, 0.79007712, 0.94247771], 
     [ 0.47477422, 0.27599007, 0.13941255]]) 

In [4]: # desired output: 

In [5]: A[::-1] 
Out[5]: array([3, 2, 1]) 

In [6]: B[::-1,::-1] 
Out[6]: 
array([[ 0.13941255, 0.27599007, 0.47477422], 
     [ 0.94247771, 0.79007712, 0.40559793], 
     [ 0.24324747, 0.45017072, 0.67402953]]) 

我心目中的应用是为了获得一个非对称矩阵的特征值和特征向量使用np.linalg.eig(相对于eigheig不保证任何顺序特征值),按绝对值对它们进行排序,并截断空间。将保持特征向量的矩阵的分量与特征值一起排列并通过切分来执行截断将是有益的。

回答

3

您可以使用np.argsort获得排序索引A。然后您可以使用这些索引重新排列B

这是不完全塞阿拉,你要如何重新排列乙...

p = np.argsort(A) 

B[:, p][p, :] # rearrange rows and column of B 
B.transpose(p) # rearrange dimensions of B 

如果你想根据特征值订购特征向量,你只能重新排列列特征向量的: (此外,可能是有意义的使用绝对值,如果你得到复杂的特征值)

e, v = eig(x) 
p = np.argsort(np.abs(e))[::-1] # descending order 
v = v[:, p] 
+0

你是对的,当然,我只需要重新排列特征向量矩阵的列。感谢您也指出了这一点。 – Jonas

1

您可以使用numpy.argsort来获取索引映射。例如:

test=np.array([2,1,3]) 
test_array=np.array([[2,3,4],[1,2,3]]) 
rearranged_array=test_array[:,test.argsort()] 

这里,test.argsort()产生[1,0,2]

相关问题