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 denselben Job ausführen?
python
numpy
multidimensional-array
flatten
numpy-ndarray
kryptoman
quelle
quelle
Antworten:
Die aktuelle API lautet:
flatten
gibt immer eine Kopie zurück.ravel
Gibt nach Möglichkeit eine Ansicht des ursprünglichen Arrays zurück. Dies ist in der gedruckten Ausgabe nicht sichtbar. Wenn Sie jedoch das von ravel zurückgegebene Array ändern, werden möglicherweise die Einträge im ursprünglichen Array geändert. 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. Sie müssen jedoch vorsichtiger sein, wenn Sie das zurückgegebene Array ändern.reshape((-1,))
Ruft eine Ansicht ab, wenn die Schritte des Arrays dies zulassen, auch wenn dies bedeutet, dass Sie nicht immer ein zusammenhängendes Array erhalten.quelle
a.flatten()
sicher eine Kopie abrufen, um diesa.ravel()
zu vermeiden Die meisten Kopien garantieren jedoch, dass das zurückgegebene Array zusammenhängend ist, unda.reshape((-1,))
um wirklich eine Ansicht zu erhalten, wann immer die Schritte des Arrays dies zulassen, auch wenn dies bedeutet, dass Sie nicht immer ein zusammenhängendes Array erhalten.ravel
Garantiert ein zusammenhängendes Array, und daher kann nicht garantiert werden, dass es eine Ansicht zurückgibt.reshape
Gibt immer eine Ansicht zurück, sodass nicht garantiert werden kann, dass ein zusammenhängendes Array zurückgegeben wird.reshape(-1)
ist gleichbedeutend mitreshape((-1,))
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.Arbeitet beispielsweise
ravel
an einer Liste von ndarrays, währendflatten
sie für diesen Objekttyp nicht verfügbar ist.@IanH weist in seiner Antwort auch auf wichtige Unterschiede bei der Speicherbehandlung hin.
quelle
ndarray
'sHier ist der richtige Namespace für die Funktionen:
numpy.ndarray.flatten
numpy.ravel
Beide Funktionen geben abgeflachte 1D-Arrays zurück, die auf die neuen Speicherstrukturen verweisen.
Im oberen Beispiel:
Wie prüfen wir, ob etwas eine Kopie ist? Verwenden Sie das
.base
Attribut desndarray
. Wenn es sich um eine Ansicht handelt, ist die Basis das ursprüngliche Array. Wenn es sich um eine Kopie handelt, ist die BasisNone
.quelle