2016-02-05 107 views
3

我有兩個,numpy陣列,第一個,A,一維,第二個,B,是在應用程序我想到的二維,但真的可以有任何維度。 B的每個索引涵蓋了與A的單個索引相同的範圍。排序一個NumPy數組並排列另一個與它

現在,我想對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(相對於eigheig不保證任何順序特徵值),按絕對值對它們進行排序,並截斷空間。將保持特徵向量的矩陣的分量與特徵值一起排列並通過切分來執行截斷將是有益的。

回答

3

您可以使用np.argsort獲得排序索引A。然後您可以使用這些索引重新排列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] 
+0

你是對的,當然,我只需要重新排列特徵向量矩陣的列。感謝您也指出了這一點。 – Jonas

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]

相關問題