2016-05-14 25 views
1

I haben:Einfügen einer Zeile in eine NumPy Array

A = np.array([[0,1,1],[0,3,2],[1,1,1],[1,5,2]]) 

wo die NumPy Array basierend auf ersten Element sortiert wird, und dann das zweite Element und so weiter.

Ich möchte [1,4,10] in A, so dass die Ausgabe einzufügen wäre:

A = array([[0,1,1],[0,3,2],[1,1,1],[1,4,10][1,5,2]])     

Wie soll ich es tun?

Antwort

2

Zunächst einmal, stapelt den neuen 1D-Array als die letzte Zeile mit np.vstack -

B = np.vstack((A,[1,4,10])) 

nun zur Aufrechterhaltung der Rangfolge zuerst prüfen und dann die zweiten und so weiter Elemente für jede Zeile, übernehmen jede Reihe als ein Indizierungs-Tupel und dann die sortierten Indizes erhalten. Dies könnte mit np.ravel_multi_index(B.T,B.max(0)+1) erreicht werden. Verwenden Sie dann diese Indizes zum Umordnen von Zeilen von B und haben Sie die gewünschte Ausgabe. Somit wäre der endgültige Code sein -

out = B[np.ravel_multi_index(B.T,B.max(0)+1).argsort()] 

Es scheint, gibt es eine Alternative mit np.lexsort die sortierten Indizes zu erhalten, die diesen Vorrang respektiert, aber tut aus in entgegengesetzter Richtung. Also müssen wir die Reihenfolge der Elemente zeilenweise umkehren, lexsort verwenden und dann die sortierten Indizes abrufen. Diese Indizes könnten dann wie im vorherigen Ansatz zur Indexierung in B verwendet werden und uns die Ausgabe liefern. Also, der alternative endgültige Code mit np.lexsort wäre -

out = B[np.lexsort(B[:,::-1].T)] 

Probelauf -

In [60]: A 
Out[60]: 
array([[0, 1, 1], 
     [0, 3, 2], 
     [1, 1, 1], 
     [1, 5, 2]]) 

In [61]: B = np.vstack((A,[1,4,10])) 

In [62]: B 
Out[62]: 
array([[ 0, 1, 1], 
     [ 0, 3, 2], 
     [ 1, 1, 1], 
     [ 1, 5, 2], 
     [ 1, 4, 10]]) # <= New row 

In [63]: B[np.ravel_multi_index(B.T,B.max(0)+1).argsort()] 
Out[63]: 
array([[ 0, 1, 1], 
     [ 0, 3, 2], 
     [ 1, 1, 1], 
     [ 1, 4, 10], # <= New row moved here 
     [ 1, 5, 2]]) 

In [64]: B[np.lexsort(B[:,::-1].T)] 
Out[64]: 
array([[ 0, 1, 1], 
     [ 0, 3, 2], 
     [ 1, 1, 1], 
     [ 1, 4, 10], # <= New row moved here 
     [ 1, 5, 2]])