Für eine kurze Antwort sollten Sie np.save
und verwenden np.load
. Die Vorteile davon sind, dass sie von Entwicklern der Numpy-Bibliothek erstellt wurden und bereits funktionieren (und wahrscheinlich bereits gut optimiert sind), z
import numpy as np
from pathlib import Path
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2
np.save(path/'x', x)
np.save(path/'y', y)
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
print(x is x_loaded) # False
print(x == x_loaded) # [[ True True True True True]]
Erweiterte Antwort:
Letztendlich hängt es wirklich von Ihren Anforderungen ab, da Sie es auch in einem für Menschen lesbaren Format speichern können (siehe Dump eines NumPy-Arrays in einer CSV-Datei ) oder sogar mit anderen Bibliotheken, wenn Ihre Dateien extrem groß sind (siehe diesen besten Weg, um Numpy-Arrays zu erhalten) auf der Festplatte für eine erweiterte Diskussion).
Wenn Sie jedoch eine Erweiterung vornehmen, da Sie das Wort "richtig" in Ihrer Frage verwenden), denke ich immer noch, dass die sofort einsatzbereite Numpy-Funktion (und der meiste Code!) Wahrscheinlich die meisten Benutzeranforderungen erfüllt. Der wichtigste Grund ist, dass es bereits funktioniert . Der Versuch, aus einem anderen Grund etwas anderes zu verwenden, führt Sie möglicherweise in ein unerwartet langes Kaninchenloch, um herauszufinden, warum es nicht funktioniert, und um es zu erzwingen.
Nehmen wir zum Beispiel den Versuch, es mit Gurke zu speichern. Ich habe das nur zum Spaß versucht und es dauerte mindestens 30 Minuten, bis mir klar wurde, dass pickle meine Sachen nicht speichern würde, wenn ich die Datei nicht im Byte-Modus mit öffnen und lesen würde wb
. Es hat einige Zeit gedauert, um zu googeln, etwas auszuprobieren, die Fehlermeldung zu verstehen usw. Kleine Details, aber die Tatsache, dass ich bereits eine Datei öffnen musste, komplizierte Dinge auf unerwartete Weise. Um hinzuzufügen, dass ich dies erneut lesen musste (was übrigens verwirrend ist) Unterschied zwischen den Modi a, a +, w, w + und r + in der eingebauten offenen Funktion?.
Wenn es also eine Schnittstelle gibt, die Ihren Anforderungen entspricht, verwenden Sie diese, es sei denn, Sie haben eine ( sehr ) guten Grund (z. B. Kompatibilität mit Matlab oder aus irgendeinem Grund möchten Sie die Datei wirklich lesen und in Python drucken, was Ihren Anforderungen nicht wirklich entspricht könnte fraglich sein). Darüber hinaus werden Sie es höchstwahrscheinlich später herausfinden, wenn Sie es optimieren müssen (anstatt ewig damit zu verbringen, nutzlose Dinge wie das Öffnen einer einfachen Numpy-Datei zu debuggen).
Verwenden Sie also die Schnittstelle / numpy zur Verfügung stellen . Es ist vielleicht nicht perfekt, es ist höchstwahrscheinlich in Ordnung, besonders für eine Bibliothek, die es schon so lange gibt.
Ich habe das Speichern und Laden von Daten mit numpy bereits auf eine Menge verbracht, also viel Spaß damit, hoffe es hilft!
import numpy as np
import pickle
from pathlib import Path
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2
# using save (to npy), savez (to npz)
np.save(path/'x', x)
np.save(path/'y', y)
np.savez(path/'db', x=x, y=y)
with open(path/'db.pkl', 'wb') as db_file:
pickle.dump(obj={'x':x, 'y':y}, file=db_file)
## using loading npy, npz files
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
db = np.load(path/'db.npz')
with open(path/'db.pkl', 'rb') as db_file:
db_pkl = pickle.load(db_file)
print(x is x_loaded)
print(x == x_loaded)
print(x == db['x'])
print(x == db_pkl['x'])
print('done')
Einige Kommentare zu dem, was ich gelernt habe:
np.save
Wie erwartet wird es bereits gut komprimiert (siehe https://stackoverflow.com/a/55750128/1601580 ) und funktioniert sofort, ohne dass Dateien geöffnet werden müssen. Reinigen. Einfach. Effizient. Benutze es.
np.savez
verwendet ein unkomprimiertes Format (siehe Dokumente ) Save several arrays into a single file in uncompressed
.npz format.
Wenn Sie sich für dieses Format entscheiden (Sie wurden gewarnt, von der Standardlösung abzuweichen , erwarten Sie also Fehler!), stellen Sie möglicherweise fest, dass Sie zum Speichern Argumentnamen verwenden müssen, es sei denn, Sie möchten Verwenden Sie die Standardnamen. Verwenden Sie dies also nicht, wenn das erste bereits funktioniert (oder wenn es funktioniert)!
- Pickle ermöglicht auch die Ausführung von beliebigem Code. Einige Benutzer möchten dies möglicherweise aus Sicherheitsgründen nicht verwenden.
- Von Menschen lesbare Dateien sind teuer in der Herstellung usw. Wahrscheinlich nicht wert.
- Es gibt so etwas wie
hdf5
große Dateien. Cool! https://stackoverflow.com/a/9619713/1601580
Beachten Sie, dass dies keine vollständige Antwort ist. Für andere Ressourcen überprüfen Sie dies: