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