Die Argsort-Funktion scheint defekt zu sein. Wenn Sie sich den bereitgestellten Code ansehen, ist der Argsort für die Zeilen [0, 1] korrekt, aber für die Zeilen [2, 3] durcheinander.
Ich habe dies auf verschiedenen NumPy-Installationen und den Versionen 1.11.0 und 1.12.0 getestet
import numpy as np
vec = np.array([
[-1.4, -1.2, 1.3],
[-3.6, 3.9, -3.7],
[-2.3, 1.5, -2. ],
[-2.6, 2.4, -1.6]
])
In [1]: np.argsort(-vec, axis=1)
Out[1]:
array([[2, 1, 0],
[1, 0, 2],
[1, 2, 0],
[1, 2, 0]])
Kann nichts falsch mit dem Ergebnis sehen, drucken Sie vec[np.arange(4)[:, np.newaxis], np.argsort(-vec, axis=1)]
aus und sehen Sie, dass es gut aussieht.
Dies ist das zweite Google-Ergebnis für "np argsort false".
Die Erklärung auf der Dokumentationsseite ist (für mich) unklar. Ich werde hier meine eigene Erklärung hinzufügen, in der Hoffnung, dass es jemandem hilft:
x = numpy.array([1.48,1.31,0.0,0.8])
print x.argsort()
>[2 3 1 0]
Einige Leute erwarten vielleicht, dass dies stattdessen [3, 2, 0, 1]
ergibt, dh das 0. Element im unsortierten Array sollte das 3. Element im sortierten Array sein.
Was es tatsächlich tut, ist, Indizes bereitzustellen, sodass x[np.argsort(x)]
Ihnen eine sortierte Liste gibt, dh [0.0, 0.8, 1.31, 1.48]
. Anders ausgedrückt, [2 3 1 0]
sagt Ihnen, dass das 0. Element des sortierten Arrays das 2. Element des unsortierten Arrays ist.
Wenn Sie wirklich [3, 2, 0, 1]
als Ausgabe erhalten möchten, können Sie dies stattdessen tun
np.argsort(np.argsort(x))
>[3 2 0 1]
Alternativ, wenn Sie wie ich wirklich nicht auf der Basis sind und nur, sagen wir, die Indizes der 3 größten Elemente in x
wollen:
np.argsort(x)[:-4:-1]
>[0, 1, 3]
Wenn Sie wirklich [3, 2, 0, 1] als Ausgabe erhalten möchten, können Sie dies stattdessen tun
Das geht schneller:
a = np.empty(len(x), np.intp)
a[np.argsort(x)] = np.arange(len(x))
np.invert_permutation(np.argsort(x))
zu numpy hinzuzufügen@rossbar , @bjnath : Vielleicht lohnt es sich, etwas aus dem Kommentar von @ghost oben zu extrahieren und es in die Dokumentation aufzunehmen? Ich habe einige weitere Querverweise hinzugefügt, um weitere Beispiele für Verwirrung zu zeigen.
Hilfreichster Kommentar
Dies ist das zweite Google-Ergebnis für "np argsort false".
Die Erklärung auf der Dokumentationsseite ist (für mich) unklar. Ich werde hier meine eigene Erklärung hinzufügen, in der Hoffnung, dass es jemandem hilft:
Einige Leute erwarten vielleicht, dass dies stattdessen
[3, 2, 0, 1]
ergibt, dh das 0. Element im unsortierten Array sollte das 3. Element im sortierten Array sein.Was es tatsächlich tut, ist, Indizes bereitzustellen, sodass
x[np.argsort(x)]
Ihnen eine sortierte Liste gibt, dh[0.0, 0.8, 1.31, 1.48]
. Anders ausgedrückt,[2 3 1 0]
sagt Ihnen, dass das 0. Element des sortierten Arrays das 2. Element des unsortierten Arrays ist.Wenn Sie wirklich
[3, 2, 0, 1]
als Ausgabe erhalten möchten, können Sie dies stattdessen tunAlternativ, wenn Sie wie ich wirklich nicht auf der Basis sind und nur, sagen wir, die Indizes der 3 größten Elemente in
x
wollen: