2017-07-18 48 views
0

Let's說我在MATLAB矩陣a和矢量b如下:Matlab的排序功能相當於在Python

a = 
    2  1  1 
    3  3  1 
    3  2  2 

b = 
    1  3  2 

使用matlab's sort功能,我可以實現以下目標:

[n idx] = sort(b) 

n = 
    1  2  3 

idx = 
    1  3  2 

anew = a(idx,idx) 

anew = 

    2  1  1 
    3  2  2 
    3  1  3 

現在,我想在Python中完全一樣。我嘗試:

a = np.array([[2,1,1],[3,3,1],[3,2,2]]) 

b = [0,2,1] 

idx = [i[0] for i in sorted(enumerate(b), key=lambda x:x[1])] 

的問題是,我無法找到一個方法來建立anew矩陣像我一樣用Matlab。我試過了:

anew=a[idx] 

anew 

array([[2, 1, 1], 
     [3, 2, 2], 
     [3, 3, 1]]) 

正如你所看到的結果(matlab vs python)是不一樣的。

任何提示?

回答

1

numpy有高級索引,所以直接使用idx這兩個維都會觸發高級索引,結果會是1d數組;以跨產品的時尚指數,你需要使用np.ix_構建指數網,從文檔中指出:

使用ix_一個可以快速構建索引數組是將指數 積。

a[np.ix_(idx, idx)] 

#array([[2, 1, 1], 
#  [3, 2, 2], 
#  [3, 1, 3]]) 

或者另一種選擇是片分爲兩步:

a[idx][:,idx] 
#array([[2, 1, 1], 
#  [3, 2, 2], 
#  [3, 1, 3]]) 
+0

謝謝你,我真的很感激 – sera