Python 排序一个NumPy数组并将另一个数组与之一起排列

Python 排序一个NumPy数组并将另一个数组与之一起排列,python,sorting,numpy,Python,Sorting,Numpy,我有两个numpy数组,第一个,A,是一维的,第二个,B,在我心目中的应用程序中是二维的,但实际上可以是任意维的。B的每个索引都覆盖了与A的单个索引相同的范围 现在,我想对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

我有两个numpy数组,第一个,
A
,是一维的,第二个,
B
,在我心目中的应用程序中是二维的,但实际上可以是任意维的。
B
的每个索引都覆盖了与
A
的单个索引相同的范围

现在,我想对
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
(与
eigh
相反,
eig
不保证特征值的任何顺序)获得非对称矩阵的特征值和特征向量,按绝对值排序,并截断空间。将包含特征向量的矩阵组件与特征值一起排列,并通过对其进行切片来执行截断是有益的。

您可以使用
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]
您可以用来获得
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]