import numpy as np
y = np.array(((1,2,3),(4,5,6),(7,8,9)))
OUTPUT:
print(y.flatten())
[1 2 3 4 5 6 7 8 9]
print(y.ravel())
[1 2 3 4 5 6 7 8 9]
Beide Funktionen geben dieselbe Liste zurück. Was brauchen dann zwei verschiedene Funktionen, die dieselbe Aufgabe ausführen?
Die aktuelle API ist die:
flatten
gibt immer eine Kopie zurück.
ravel
gibt wann immer möglich eine Ansicht des ursprünglichen Arrays zurück. Dies ist in der gedruckten Ausgabe nicht sichtbar, aber wenn Sie das von ravel zurückgegebene Array ändern, kann es die Einträge im ursprünglichen Array ändern. Wenn Sie die Einträge in einem von Flatten zurückgegebenen Array ändern, wird dies niemals passieren. ravel ist oft schneller, da kein Speicher kopiert wird, aber Sie müssen vorsichtiger sein, wenn Sie das Array ändern, das es zurückgibt.
reshape((-1,))
erhält eine Ansicht, wann immer die Schritte des Arrays dies zulassen, auch wenn dies bedeutet, dass Sie nicht immer ein zusammenhängendes Array erhalten.
Wie hier erklärt, besteht ein wesentlicher Unterschied darin, dass:
-
flatten
ist eine Methode eines ndarray-Objekts und kann daher nur für echte numpy-Arrays aufgerufen werden.
-
ravel
ist eine Funktion auf Bibliotheksebene und kann daher für jedes Objekt aufgerufen werden, das erfolgreich analysiert werden kann.
Zum Beispiel ravel
wird auf einer Liste von ndarrays arbeiten, während flatten
ist für diesen Objekttyp nicht verfügbar.
@IanH weist in seiner Antwort auch auf wichtige Unterschiede bei der Speicherverwaltung hin.
Hier ist der korrekte Namensraum für die Funktionen:
Beide Funktionen geben abgeflachte 1D-Arrays zurück, die auf die neuen Speicherstrukturen zeigen.
import numpy
a = numpy.array([[1,2],[3,4]])
r = numpy.ravel(a)
f = numpy.ndarray.flatten(a)
print(id(a))
print(id(r))
print(id(f))
print(r)
print(f)
print("\nbase r:", r.base)
print("\nbase f:", f.base)
---returns---
140541099429760
140541099471056
140541099473216
[1 2 3 4]
[1 2 3 4]
base r: [[1 2]
[3 4]]
base f: None
Im oberen Beispiel:
- die Speicherorte der Ergebnisse unterschiedlich sind,
- die Ergebnisse sehen gleich aus
- flatten würde eine Kopie zurückgeben
- ravel würde eine Ansicht zurückgeben.
Wie prüfen wir, ob etwas eine Kopie ist? Verwendung der .base
Attribut der ndarray
. Wenn es sich um eine Ansicht handelt, ist die Basis das ursprüngliche Array; wenn es eine Kopie ist, wird die Basis sein None
.
Überprüfen Sie, ob a2
ist eine Kopie von a1
import numpy
a1 = numpy.array([[1,2],[3,4]])
a2 = a1.copy()
id(a2.base), id(a1.base)
Aus:
(140735713795296, 140735713795296)
Ravel gibt normalerweise eine Ansicht in das vorhandene Array zurück (manchmal gibt es eine Kopie zurück). Flatten gibt ein neues Array zurück.
– Alex
8. März 2015 um 18:55 Uhr
Mögliches Duplikat von Was ist der Unterschied zwischen Flatten und Ravel in numpy?
– finnw
22. August 2016 um 2:32 Uhr
Hier ist eine praktische Demonstration des feinen Unterschieds.
– Prosti
22. Januar 2019 um 17:12 Uhr
Kann also jemand ein Beispiel geben, wann es besser ist, ein Array zu glätten und wann es aufzulösen ist?
– Aleksandar
28. März 2020 um 19:00 Uhr
Danke für die Nachfrage, ich hatte die gleiche Frage.
– Andrei Toroplean
12. Oktober 2020 um 8:31 Uhr