对 NumPy 数组进行排序并与它一起排列另一个数组

Jon*_*ann 5 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]])
Run Code Online (Sandbox Code Playgroud)

我想到的应用是获取非对称矩阵的特征值和特征向量np.linalg.eig(与 相比eigheig不保证特征值的任何排序),按绝对值对它们进行排序,并截断空间。置换包含特征向量和特征值的矩阵的分量并通过对其进行切片来执行截断将是有益的。

kaz*_*ase 5

您可以使用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
Run Code Online (Sandbox Code Playgroud)

如果你想根据特征值对特征向量进行排序,你应该只重新排列特征向量的列:(另外,使用绝对值可能是有意义的,以防你得到复杂的特征值)

e, v = eig(x)
p = np.argsort(np.abs(e))[::-1]  # descending order
v = v[:, p]
Run Code Online (Sandbox Code Playgroud)