【问题标题】:Sorting a NumPy array and permuting another one along with it对 NumPy 数组进行排序并与它一起排列另一个数组
【发布时间】:2016-02-05 09:26:51
【问题描述】:

我有两个 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不保证特征值的任何顺序),按绝对值排序,并截断空间。将包含特征向量的矩阵的分量与特征值一起置换并通过切片来执行截断是有益的。

【问题讨论】:

    标签: python sorting numpy


    【解决方案1】:

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

    【讨论】:

    • 你当然是对的,我只需要重新排列特征向量矩阵的列。也感谢您指出这一点。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多