Python 排序一个NumPy数组并将另一个数组与之一起排列
我有两个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
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]