Numpy: argsort funktioniert nicht für mehrdimensionale Arrays

Erstellt am 19. Mai 2014  ·  12Kommentare  ·  Quelle: numpy/numpy

Betrachten Sie den folgenden Code:
a = np.zufällig.zufällig([5,5])
ind = np.argsort(a, Achse=1)
a_sorted = a[ind]
np.sort(a, Achse=1)

jetzt sollten a_sorted und a beide entlang der 1-Achse sortiert sein. Allerdings sind nicht einmal die Formen mehr identisch. a ist immer noch (5,5), während a_sorted (5,5,5) ist. Wenn dies das beabsichtigte Verhalten ist, kann mir jemand sagen warum?

Hilfreichster Kommentar

Es wäre gut, wenn es ein Beispiel dafür gäbe, wie die Ausgabe tatsächlich zum Sortieren des ND-Arrays verwendet wird.

Es wäre auch gut, wenn es eine lesbarere Lösung als a[np.arange(np.shape(a)[0])[:,np.newaxis], np.argsort(a)] gäbe

Alle 12 Kommentare

argsort() funktioniert einwandfrei, aber die Indizierung funktioniert nicht so, wie Sie es erwarten.

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced -indexing

Versuche dies:

a = np.random.random([5,5])
i = np.arange(len(a))[:, np.newaxis]
j = np.argsort(a, axis=1)
a_sorted = a[i, j]
np.sort(a, axis=1)

Ich war genauso verwirrt. In der Dokumentation heißt es ausdrücklich,

Kehrt zurück
index_array : ndarray, int
Array von Indizes, die a entlang der angegebenen Achse sortieren.
Mit anderen Worten, a[index_array] ergibt ein sortiertes a .

Das gilt nur für ein 1D-Array. Sollte die Dokumentation dahingehend erweitert werden, dass dies bei ND-Arrays nicht der Fall ist?

@lzkelley Ja, ein Patch zur Verbesserung der Dokumentation wäre sehr willkommen.

@shoyer cool, ich werde eine PR dafür machen und aktualisieren

Es wäre gut, wenn es ein Beispiel dafür gäbe, wie die Ausgabe tatsächlich zum Sortieren des ND-Arrays verwendet wird.

Es wäre auch gut, wenn es eine lesbarere Lösung als a[np.arange(np.shape(a)[0])[:,np.newaxis], np.argsort(a)] gäbe

Vielleicht könnte @seberg es zu einer seiner Indexierungsfunktionsergänzungen machen.

Ich glaube nicht, dass es sehr offensichtlich zur Indizierung passt, eine Auswahlfunktion oder so ist wahrscheinlich eine einfachere Übereinstimmung.

+1 für eine neue Funktion.

Soll nicht der gesamte Zweck von argsort (im Gegensatz zu sort ) für die Indizierung verwendet werden?

argsort liefert die Indizes zum Sortieren entlang einer Achse, aber das Sortieren entlang dieser Achse mithilfe der Indizes erscheint unnötig ausführlich. Es sei denn, es gibt einen einfacheren Weg, der mir nicht bekannt ist.

eine Auswahlfunktion oder so ist wahrscheinlich eine einfachere Übereinstimmung.

Das ist #8708

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen