Ob Sie es glauben oder nicht, nachdem Sie meinen aktuellen Code profiliert haben, hat die wiederholte Operation der Numpy-Array-Umkehrung einen riesigen Teil der Laufzeit verschlungen. Was ich gerade habe, ist die übliche ansichtsbasierte Methode:
reversed_arr = arr[::-1]
Gibt es eine andere Möglichkeit, es effizienter zu machen, oder ist es nur eine Illusion aus meiner Besessenheit von unrealistischer Numpy-Performance?
arr[::-1]
nur eine umgekehrte Ansicht zurück. Es ist so schnell wie möglich und hängt nicht von der Anzahl der Elemente im Array ab, da es nur die Schritte ändert. Ist das, was Sie umkehren, tatsächlich ein numpy Array?arr
ist ein numpy Array.f2py
ist dein Freund! Es lohnt sich oft, leistungskritische Teile eines Algorithmus (insbesondere im wissenschaftlichen Rechnen) in einer anderen Sprache zu schreiben und von Python aus aufzurufen. Viel Glück!arr[::-1]
: github.com/numpy/numpy/blob/master/numpy/lib/twodim_base.py ist . Suche nachdef flipud
. Die Funktion ist buchstäblich vier Zeilen lang.Antworten:
Beim Erstellen erstellen
reversed_arr
Sie eine Ansicht in das ursprüngliche Array. Sie können dann das ursprüngliche Array ändern, und die Ansicht wird aktualisiert, um die Änderungen widerzuspiegeln.Erstellen Sie die Ansicht häufiger neu als nötig? Sie sollten in der Lage sein, so etwas zu tun:
Ich bin kein Numpy-Experte, aber dies scheint der schnellste Weg zu sein, um Dinge in Numpy zu erledigen. Wenn Sie dies bereits tun, können Sie es meiner Meinung nach nicht verbessern.
PS Tolle Diskussion über numpy Ansichten hier:
Blick auf ein numpy Array?
quelle
look_at
Funktion tun?reversed_arr
nach dem Ändern der zugrunde liegenden Daten weiterhin verwendet werden kann. Das Schreiben neuer Werte in das Array macht die Ansicht nicht ungültig. Tatsächlich können Sie die Ansicht auch zum Schreiben neuer Werte in das Array verwenden.reversed_arr[0] = 99
würde das letzte Element im Array auf 99 setzen, genau wiearr[-1] = 99
würde.Wie oben erwähnt, wird
a[::-1]
wirklich nur eine Ansicht erstellt, sodass es sich um eine Operation mit konstanter Zeit handelt (und als solche nicht länger dauert, wenn das Array wächst). Wenn das Array zusammenhängend sein muss (z. B. weil Sie viele Vektoroperationen damit ausführen),ascontiguousarray
ist es ungefähr so schnell wieflipup
/fliplr
:Code zum Generieren des Plots:
quelle
Weil dies noch nicht als beantwortet markiert zu sein scheint ... Die Antwort von Thomas Arildsen sollte die richtige sein: einfach verwenden
wenn es sich um ein 1d-Array (Spaltenarray) handelt.
Mit Matrizen machen
Wenn Sie Zeilen umkehren und
flipud(matrix)
Spalten umdrehen möchten. Sie müssen Ihr 1d-Spaltenarray nicht zu einem zweidimensionalen Zeilenarray (Matrix mit einer Ebene "Keine") machen und es dann umdrehen.quelle
np.fliplr()
Kippt das Array von links nach rechts.Beachten Sie, dass Sie es für 1d-Arrays ein wenig austricksen müssen:
quelle
reversed_arr = np.flipud(arr1d)
scheint direkt zu funktionieren.Ich werde auf die frühere Antwort über näher eingehen
np.fliplr()
. Hier ist ein Code, der zeigt, wie ein 1d-Array erstellt, in ein 2d-Array umgewandelt, umgedreht und dann wieder in ein 1d-Array konvertiert wird.time.clock()
wird verwendet, um die Zeit zu halten, die in Sekunden angegeben wird.Mit unkommentierter Druckanweisung:
Mit auskommentierter Druckerklärung:
In Bezug auf die Effizienz finde ich das anständig. Für diejenigen unter Ihnen, die es lieben, es in einer Zeile zu tun, ist hier diese Form.
quelle
Ich werde ein kurzes Beispiel geben, um das zu erweitern, was andere gesagt haben.
Wenn Sie ein 1D-Array haben ...
Aber wenn Sie mit einem 2D-Array arbeiten ...
Dies kehrt die Matrix nicht wirklich um.
Sollte np.flip verwenden, um die Elemente tatsächlich umzukehren
Wenn Sie die Elemente einer Matrix einzeln drucken möchten, verwenden Sie flach zusammen mit Flip
quelle
Damit es mit negativen Zahlen und einer langen Liste funktioniert, können Sie Folgendes tun:
Wo Flipud für 1d Arra ist
quelle