Ich frage mich, wie man numpy.array
Daten richtig speichert und lädt . Derzeit verwende ich die numpy.savetxt()
Methode. Wenn ich zum Beispiel ein Array habe markers
, das so aussieht:
Ich versuche es zu speichern mit:
numpy.savetxt('markers.txt', markers)
In einem anderen Skript versuche ich, zuvor gespeicherte Dateien zu öffnen:
markers = np.fromfile("markers.txt")
Und das bekomme ich ...
Gespeicherte Daten sehen zunächst so aus:
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
Aber wenn ich gerade geladene Daten mit der gleichen Methode speichere, dh. numpy.savetxt()
es sieht aus wie das:
1.398043286095131769e-76
1.398043286095288860e-76
1.396426376485745879e-76
1.398043286055061908e-76
1.398043286095288860e-76
1.182950697433698368e-76
1.398043275797188953e-76
1.398043286095288860e-76
1.210894289234927752e-99
1.398040649781712473e-76
Was mache ich falsch? PS: Es gibt keine andere "Backstage" -Operation, die ich durchführe. Nur speichern und laden, und das bekomme ich. Vielen Dank im Voraus.
np.save()
und speichern / ladennp.load()
.scipy.io.savemat
und verwendenscipy.io.loadmat
.fromfile
die Daten als binär gelesen.loadtxt
ist die richtige Paarung mitsavetxt
. Schauen Sie sich die Funktionsdokumentation an.Antworten:
Der zuverlässigste Weg, den ich gefunden habe, ist die Verwendung
np.savetxt
mitnp.loadtxt
und nichtnp.fromfile
die, die besser für Binärdateien geeignet ist, mit denen geschrieben wurdetofile
. Die Methodennp.fromfile
undnp.tofile
schreiben und lesen Binärdateiennp.savetxt
eine Textdatei geschrieben wird. Also zum Beispiel:Oder:
Ich verwende die erstere Methode, auch wenn sie langsamer ist und (manchmal) größere Dateien erstellt: Das Binärformat kann plattformabhängig sein (z. B. hängt das Dateiformat von der Endianität Ihres Systems ab).
Es ist ein plattformunabhängiges Format für NumPy Arrays, die gespeichert und gelesen werden kann mit
np.save
undnp.load
:quelle
.npy
Dateien (z. B. generiert vonnp.save()
) sind plattformunabhängig und kompakter und schneller zu erstellen als Textdateien.np.savez
wenn Sie die Ausgabe komprimieren möchten.np.savez
speichert mehrere Arrays unkomprimiert -np.savez_compressed
komprimiert sie - es gibt noch keinenp.save_compressed
. Siehe docs.scipy.org/doc/numpy-1.15.1/reference/routines.io.htmlquelle
pickle
?x = db["x"]
gefolgt vony = db["y"]
?np.fromfile()
hat einsep=
Schlüsselwortargument:Der Standardwert von
sep=""
bedeutet, dassnp.fromfile()
versucht wird, ihn als Binärdatei und nicht als durch Leerzeichen getrennte Textdatei zu lesen, sodass Sie unsinnige Werte zurückerhalten. Wenn Sie verwenden, erhaltennp.fromfile('markers.txt', sep=" ")
Sie das gewünschte Ergebnis.Wie andere bereits
np.loadtxt()
betont haben, ist dies jedoch die bevorzugte Methode zum Konvertieren von Textdateien in numpy-Arrays. Wenn die Datei nicht für Menschen lesbar sein muss, ist es normalerweise besser, stattdessen Binärformate zu verwenden (z . B.np.load()
/np.save()
).quelle
pickle
?Für eine kurze Antwort sollten Sie
np.save
und verwendennp.load
. Die Vorteile davon sind, dass sie von Entwicklern der Numpy-Bibliothek erstellt wurden und bereits funktionieren (und wahrscheinlich bereits gut optimiert sind), zErweiterte 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!
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
.npzformat.
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)!hdf5
große Dateien. Cool! https://stackoverflow.com/a/9619713/1601580Beachten Sie, dass dies keine vollständige Antwort ist. Für andere Ressourcen überprüfen Sie dies:
np.save
: Verwenden Sie nicht Essiggurke ): Speichern Sie Numpy Array mit Essiggurkequelle