2017-07-18 3 views
0

Sagen wir, dass ich eine Matrix a in Matlab und einen Vektor b wie folgt:Matlab Sortierfunktion äquivalent in Python

a = 
    2  1  1 
    3  3  1 
    3  2  2 

b = 
    1  3  2 

Mit matlab's sort Funktion ich folgendes erreichen kann:

[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 

Jetzt möchte ich genau dasselbe in Python tun. Mein Versuch:

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])] 

Das Problem ist, dass ich nicht einen Weg zu bauen, die anew Matrix finden kann, wie ich Matlab tat verwenden. Ich habe versucht:

anew=a[idx] 

anew 

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

Wie Sie sehen können, sind die Ergebnisse (Matlab vs Python) nicht das Gleiche.

Irgendwelche Tipps?

Antwort

1

numpy hat erweiterte Indizierung, so direkt idx auf beiden Dimension wird erweiterte Indizierung ausgelöst und das Ergebnis wird ein 1d-Array sein; Um Index in einem Kreuzprodukt Art und Weise, müssen Sie np.ix_ verwenden, um den Index Mesh zu konstruieren, wie sie aus der Dokumentation angegeben:

Mit ix_ kann man schnell Indexfelder konstruieren, die indiziert das Kreuzprodukt.

a[np.ix_(idx, idx)] 

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

Oder eine andere Möglichkeit ist, in Scheiben schneiden in zwei Schritten:

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

Danke ich wirklich zu schätzen – sera