Ich bin überrascht, dass diese spezielle Frage noch nicht gestellt wurde, aber ich habe sie weder in SO noch in der Dokumentation von gefunden np.sort
.
Angenommen, ich habe ein zufälliges Numpy-Array mit ganzen Zahlen, z.
> temp = np.random.randint(1,10, 10)
> temp
array([2, 4, 7, 4, 2, 2, 7, 6, 4, 4])
Wenn ich es sortiere, erhalte ich standardmäßig aufsteigende Reihenfolge:
> np.sort(temp)
array([2, 2, 2, 4, 4, 4, 4, 6, 7, 7])
Ich möchte jedoch, dass die Lösung in absteigender Reihenfolge sortiert wird.
Jetzt weiß ich, dass ich immer tun kann:
reverse_order = np.sort(temp)[::-1]
Aber ist diese letzte Aussage effizient ? Erstellt es keine Kopie in aufsteigender Reihenfolge und kehrt diese Kopie dann um, um das Ergebnis in umgekehrter Reihenfolge zu erhalten? Wenn dies tatsächlich der Fall ist, gibt es eine effiziente Alternative? Es sieht nicht so aus, als würde es np.sort
Parameter akzeptieren, um das Vorzeichen der Vergleiche in der Sortieroperation zu ändern und die Dinge in umgekehrter Reihenfolge zu erhalten.
temp[::-1].sort()
, dass es in umgekehrter Reihenfolge sortieren muss? Ich lese es so: Kehre das ursprüngliche Array um und sortiere es dann (in aufsteigender Reihenfolge). Warum würde das Umkehren des ursprünglichen Arrays (in zufälliger Reihenfolge) und das anschließende Sortieren in aufsteigender Reihenfolge das Array in umgekehrter Reihenfolge zurückgeben?[::-1]
scheint zu funktionieren, da numpy einfach angewiesen wird, das Array rückwärts zu durchlaufen, anstatt das Array tatsächlich neu zu ordnen. Wenn also die In-Place-Sortierung erfolgt, sortiert sie tatsächlich in aufsteigender Reihenfolge und verschiebt die Bits, lässt jedoch den Teil der Rückwärtsiteration unberührt.a=np.array((...))
die Redewendunga[::-1]
nichts umkehrt, handelt es sich lediglich um eine neue Ansicht derselben Daten, insbesondere um eine Spiegelansicht. Das Verfahrena[::-1].sort()
arbeitet mit dem gespiegelten Bild , was bedeutet, dass wenn ein kleineres Element in seinem gespiegelten Bildsort
nach links verschoben wird, es in Wirklichkeit im realen Speicherblock des Arrays nach rechtsa
verschoben wird. Die gespiegelte Ansicht ist in aufsteigender Reihenfolge sortiert, die realen Daten sind in absteigender Reihenfolge sortiert. Probieren Sie es zu Hause aus, mit verschiedenen Münzen und einem Spiegel!np.sort(temp,order='descending')
anstatt diese Art von Hacks zu erfordernquelle
axis
an dienp.sort
angewandt wurde notwendig.np.sort(temp)[::-1]
dassnan
s auf der Rückseite des Arrays anstelle der Vorderseite platziert wird. Ob das gut oder schlecht ist, steht zur Debatte.Für kurze Arrays schlage ich vor
np.argsort()
, die Indizes des sortierten negierten Arrays zu ermitteln, was etwas schneller ist als das Umkehren des sortierten Arrays:quelle
a[np.argsort(-a)]
ist wahrscheinlich der beste Ansatz für alle anderen auf dieser Seite. Keine Umkehrung von -1 Schritten und ein Minuszeichen weniger zum Nachdenken.Leider
np.sort(temp)[::-1]
funktioniert ein komplexes Array nur ordnungsgemäß. Die beiden anderen hier genannten Methoden sind nicht wirksam.quelle
Seien Sie vorsichtig mit den Abmessungen.
Lassen
Volle Umkehrung
flip
geändert in1.15
, frühere Versionen erforderlich . Lösung : .1.14
axis
pip install --upgrade numpy
Erste Dimension umgekehrt
Zweite Dimension umgekehrt
Testen
1000-maliges Testen auf einem 100 × 10 × 10-Array.
Dies ist hauptsächlich auf die Neuindizierung und nicht auf die Neuindizierung zurückzuführen
argsort
.quelle
Hallo, ich habe nach einer Lösung gesucht, um das Sortieren eines zweidimensionalen Numpy-Arrays umzukehren, und ich konnte nichts finden, was funktioniert hat, aber ich glaube, ich bin auf eine Lösung gestoßen, die ich hochlade, nur für den Fall, dass sich jemand im selben Boot befindet.
np.sort sortiert aufsteigend, was nicht das ist, was Sie wollen, aber der Befehl fliplr dreht die Zeilen von links nach rechts! Scheint zu funktionieren!
Hoffe es hilft dir!
Ich denke, es ist ähnlich wie der Vorschlag über -np.sort (-a) oben, aber ich wurde durch den Kommentar davon abgehalten, dass es nicht immer funktioniert. Vielleicht funktioniert meine Lösung auch nicht immer, aber ich habe sie mit ein paar Arrays getestet und scheint in Ordnung zu sein.
quelle
Sie können das Array zuerst sortieren (standardmäßig aufsteigend) und dann np.flip () anwenden ( https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html ).
Zu Ihrer Information Es funktioniert auch mit Datetime-Objekten.
Beispiel:
quelle
x = np.array([2,3,np.nan,1,0])
dann dernp.flip(np.sort(x))
Ansatz [nan 3. 2. 1. 0.]-np.sort(-x)
ergibt , während der Ansatz [3. 2. 1. 0. nan] ergibt.Hier ist ein kurzer Trick
quelle
Ich schlage vor, dies zu verwenden ...
beispielsweise:
Dann Ihr Resault:
quelle
np.arange(20-0.5, 10-0.5, -0.5)
. Aber das ist eine andere Geschichte und kann wegen der schlechteren Lesbarkeit umstritten sein. Ein Eingabearray ist überhaupt nicht sortiert