对NumPy数组进行排序并随之更换另一个数组

时间:2016-02-05 09:26:51

标签: python sorting numpy

我有两个numpy数组,第一个,A是一维的,第二个,B,在我想到的应用程序中是二维的,但实际上可以有任何尺寸。 B的每个索引都涵盖与A的单个索引相同的范围。

现在,我想按A排序(按降序排列),但希望将B的每个维度与其一起置换。从数学上讲,如果P是排序A的排列矩阵,我想根据B转换np.dot(P, np.dot(B, P.T))。例如。考虑这个例子,其中排序巧合地对应于颠倒顺序:

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获得非对称矩阵的特征值和特征向量(与eigh相反,eig不保证特征值的任何排序),按绝对值对它们进行排序,并截断空格。置换保持特征向量的矩阵的分量以及特征值是有益的,并通过切片来执行截断。

2 个答案:

答案 0 :(得分:4)

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

你想要重新安排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]

答案 1 :(得分: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]