Sortieren eines zweidimensionalen Array mit mehreren Achsen
Ich habe ein 2D-numpy-array der Form (N,2), die halten die N Punkte (x-und y-Koordinaten). Zum Beispiel:
array([[3, 2],
[6, 2],
[3, 6],
[3, 4],
[5, 3]])
Ich würde gerne zu Sortieren, so dass meine Punkte sind sortiert nach x-Koordinate, dann nach y in den Fällen, wo die x-Koordinate ist die gleiche. Also das array soll so Aussehen:
array([[3, 2],
[3, 4],
[3, 6],
[5, 3],
[6, 2]])
Ob dies eine normale Python-Liste, würde ich einfach definieren, einen Komparator zu tun, was ich will, aber soweit ich das beurteilen kann, numpy die Funktion Sortieren wird nicht akzeptiert Benutzer-definierte Komparatoren. Irgendwelche Ideen?
EDIT: vielen Dank für die Ideen! Ich habe ein quick-test mit 1000000 zufälligen ganzzahligen Punkte, und zudem diejenigen, die ich laufen konnte (sorry, kann kein upgrade numpy im moment).
Mine: 4.078 secs
mtrw: 7.046 secs
unutbu: 0.453 secs
InformationsquelleAutor der Frage perimosocordiae | 2010-04-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit lexsort:
a.ravel()
gibt eine Ansicht, wenna
istC_CONTIGUOUS
. Wenn das wahr ist,@ars-Methodeleicht modifiziert durch die Verwendung
ravel
stattflatten
ergibt sich eine schöne Möglichkeit zum Sortierena
in-place -:Seit
b
ist eine Ansicht vona
-, Sortier -b
Artena
:InformationsquelleAutor der Antwort unutbu
Sagt der Titel "Sortieren 2D-arrays". Obwohl der Fragesteller benutzt eine
(N,2)
-förmige array, es ist möglich, zu verallgemeinern unutbu die Lösung funktioniert mit jedem(N,M)
array, wie das ist, was die Menschen eigentlich sein könnten suchen.Könnte man
transpose
das array und die Verwendung der slice-notation mit negativenstep
alle übergeben die Spaltenlexsort
in umgekehrter Reihenfolge:InformationsquelleAutor der Antwort arekolek
Können Sie
np.complex_sort
. Dies hat den Nebeneffekt, ändern Sie Ihre Daten " floating point, ich hoffe, das ist nicht ein problem:InformationsquelleAutor der Antwort mtrw
Ich kämpfte mit der gleichen Sache und bekam Hilfe und hat das problem gelöst. Es funktioniert reibungslos, wenn das array Spaltennamen (structured array) und ich denke, das ist eine sehr einfache Möglichkeit zum Sortieren mit der gleichen Logik, dass excel nicht:
Beachten Sie die doppelten Klammern um die Sortier-Kriterien. Und natürlich können auch mehr als 2 Spalten, die als Sortierkriterien.
InformationsquelleAutor der Antwort JaimeBee
Den numpy_indexed - Paket (disclaimer: ich bin sein Autor) kann verwendet werden, um zu lösen diese Art der Verarbeitung-auf-nd-array-Probleme in einer effizienten, vollständig vektorisiert Weise:
InformationsquelleAutor der Antwort Eelco Hoogendoorn
EDIT: entfernt, schlecht zu beantworten.
Hier ist ein Weg, es zu tun mit einem zwischengeschalteten strukturierte array:
welche gibt die gewünschte Ausgabe:
Nicht sicher, ob dies ist wohl der beste Weg, um darüber zu gehen obwohl.
InformationsquelleAutor der Antwort ars
Fand ich einen Weg, es zu tun:
Es ist ziemlich schrecklich, zu müssen, zu Sortieren, zweimal (und verwenden Sie den nur-python -
sorted
Funktion, anstatt eine schnellere numpy sort), aber es passt sehr schön auf einer Linie.InformationsquelleAutor der Antwort perimosocordiae