Was ist der Unterschied zwischen Flatten- und Ravel-Funktionen in numpy?

Lesezeit: 4 Minuten

Benutzer-Avatar
kryptomanisch

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?

  • 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

Benutzer-Avatar
IanH

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.

  • Irgendeine Idee, warum NumPy-Entwickler sich nicht an eine Funktion mit einem Parameter copy= gehalten haben[True,False]?

    – Frank Dernoncourt

    17. November 2015 um 17:49 Uhr


  • Backcompat-Garantien führen manchmal dazu, dass seltsame Dinge wie diese passieren. Zum Beispiel: Die numpy-Entwickler haben kürzlich (in 1.10) eine zuvor implizite Garantie hinzugefügt, dass ravel ein zusammenhängendes Array zurückgeben würde (eine Eigenschaft, die beim Schreiben von C-Erweiterungen sehr wichtig ist), also ist es jetzt die API a.flatten() um sicher eine Kopie zu bekommen, a.ravel() um die meisten Kopien zu vermeiden, aber dennoch sicherzustellen, dass das zurückgegebene Array zusammenhängend ist, und a.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.

    – IanH

    17. November 2015 um 20:59 Uhr

  • @Hossein IanH hat es erklärt: ravelgarantiert ein zusammenhängendes Array, und daher ist es nicht garantiert, dass es eine Ansicht zurückgibt; reshape gibt immer eine Ansicht zurück, und daher ist nicht garantiert, dass sie ein zusammenhängendes Array zurückgibt.

    – ich führe

    10. Februar 2017 um 19:49 Uhr

  • @Hossein Das wäre eine ganz neue Frage. Kurz gesagt, es ist viel schneller, einen zusammenhängenden Speicherplatz zu lesen und zu schreiben. Es gibt mehrere Fragen und Antworten dazu hier auf SO (schönes Beispiel hier), zögern Sie nicht, ein neues zu eröffnen, wenn Sie weitere Fragen haben.

    – ich führe

    10. Februar 2017 um 20:40 Uhr

  • Warum heißt es ravel? Welche Idee steckt hinter dem Namen?

    – aus99555

    26. Januar 2019 um 6:49 Uhr

Benutzer-Avatar
Bryan P

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.

  • thx für diese Info über das ravel(), das an Listen von arbeitet ndarray‘s

    – WestCoastProjects

    28. Oktober 2018 um 2:39 Uhr

  • Nicht nur Listen von Arrays, sondern auch Listen von Listen 🙂

    – timtody

    18. Juni 2020 um 9:51 Uhr

Benutzer-Avatar
Prosti

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)

  • id(a1.base) sollte gleich sein id(a2.base)

    – Prosti

    29. Januar 2021 um 12:55 Uhr

1006060cookie-checkWas ist der Unterschied zwischen Flatten- und Ravel-Funktionen in numpy?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy