我有两个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
不保证特征值的任何排序),根据绝对值对它们进行排序,并截断空间。这将有利于改变矩阵的各分量,保持特征向量和特征值,并通过切片进行截断。
发布于 2016-02-05 09:38:41
您可以使用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]
发布于 2016-02-05 09:37:12
您可以使用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]
。
https://stackoverflow.com/questions/35220464
复制相似问题