Numpy: argsort liefert falsche Ergebnisse

Erstellt am 8. März 2017  ·  4Kommentare  ·  Quelle: numpy/numpy

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

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:

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]

Alle 4 Kommentare

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

9880 schlägt vor, dies als 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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen