我有两个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
不保证特征值的任何排序),按绝对值对它们进行排序,并截断空格。置换保持特征向量的矩阵的分量以及特征值是有益的,并通过切片来执行截断。
答案 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]
。