Eingabe und Ausgabe von Numpy-Arrays auf h5py

100

Ich habe einen Python-Code, dessen Ausgabe eine Geben Sie hier die Bildbeschreibung einMatrix mit Größe ist, deren Einträge alle vom Typ sind float. Wenn ich es mit der Erweiterung .datspeichere, liegt die Dateigröße in der Größenordnung von 500 MB. Ich habe gelesen, dass die Verwendung h5pydie Dateigröße erheblich reduziert. Nehmen wir also an, ich habe das 2D-Numpy-Array benannt A. Wie speichere ich es in einer h5py-Datei? Wie lese ich dieselbe Datei und füge sie als Numpy-Array in einen anderen Code ein, da ich Manipulationen mit dem Array vornehmen muss?

Liebesgeschwindigkeit
quelle
4
Wie speichern Sie es mit der .datErweiterung?
Jorgeca
@ Jorgeca: dafür mache ich einfachnp.savetxt("output.dat",A,'%10.8e')
Lovespeed
3
Danke (die Erweiterung allein bedeutet nicht viel, sie könnte als binär, ascii ... gespeichert werden). Sofern Sie nicht die zusätzlichen Funktionen von hdf5 benötigen, würde ich nur verwenden np.save('output.dat', A), um es in einem Binärformat zu speichern (viel schneller, viel weniger Speicherplatz).
Jorgeca
@ Georgeca, aber wird ein anderes Python-Skript es als 2D-Array lesen können, wenn ich es alsA = np.loadtxt('output.dat',unpack=True)
Lovespeed
2
h5pyErstellen Sie also keine kleineren Dateien als diese np.save? ist h5pyschneller als np.savefür Arrays der in der Frage angegebenen Größe?
Dbliss

Antworten:

131

h5py bietet ein Modell von Datensätzen und Gruppen . Ersteres sind im Grunde Arrays und letzteres können Sie sich als Verzeichnisse vorstellen. Jeder ist benannt. Sie sollten sich die Dokumentation zur API und Beispiele ansehen:

http://docs.h5py.org/en/latest/quick.html

Ein einfaches Beispiel, in dem Sie alle Daten im Voraus erstellen und nur in einer HDF5-Datei speichern möchten, sieht ungefähr so ​​aus:

In [1]: import numpy as np
In [2]: import h5py
In [3]: a = np.random.random(size=(100,20))
In [4]: h5f = h5py.File('data.h5', 'w')
In [5]: h5f.create_dataset('dataset_1', data=a)
Out[5]: <HDF5 dataset "dataset_1": shape (100, 20), type "<f8">

In [6]: h5f.close()

Sie können diese Daten dann wieder laden, indem Sie Folgendes verwenden: '

In [10]: h5f = h5py.File('data.h5','r')
In [11]: b = h5f['dataset_1'][:]
In [12]: h5f.close()

In [13]: np.allclose(a,b)
Out[13]: True

Schauen Sie sich auf jeden Fall die Dokumente an:

http://docs.h5py.org

Das Schreiben in eine hdf5-Datei hängt entweder von h5py oder pytables ab (jede hat eine andere Python-API, die sich über der hdf5-Dateispezifikation befindet). Sie sollten auch einen Blick auf andere einfache Binärformaten nehmen von numpy bereitgestellt nativ wie np.save, np.savezetc:

http://docs.scipy.org/doc/numpy/reference/routines.io.html

JoshAdel
quelle
Übrigens. Wenn Sie den Namen des Datensatzes beim Lesen nicht vorher kennen, müssen Sie die HDF-Datei ähnlich wie hier analysieren .
Trilarion
@JoshAdel, wenn ich dem Datensatz eine Spalte hinzufügen möchte. Mein Datensatz ist ein mehrdimensionales np.array, das als [img_id, Zeilen, Spalten, Kanäle] indiziert ist. und ich habe es mit der in Ihrer Antwort beschriebenen Methode gespeichert. Ich greife mit h5f ['dataset_1'] [img_id] auf alle Punkte im Datensatz zu. Was ich möchte, ist eine Möglichkeit, eine weitere Spalte hinzuzufügen, die 'mycolumn' sagt ... entsprechend jeder img_id im Datensatz. Wie soll ich eine weitere Spalte hinzufügen, damit ich h5f ['mycolumn'] [img_id] ausführen kann?
Iratzhash
Wenn ich solche Matrizen schreibe, kann ich sie mit HDFView 2.11 nicht sehen. Ich kann die Datei öffnen. Ich kann sehen, dass das Dataset data.h5vorhanden ist, aber ich kann es nicht mit HDFView anzeigen. Ich kann den Inhalt mit h5py lesen, aber nicht mit HDFView überprüfen. Irgendeine Idee warum?
Martin Thoma
104

Eine sauberere Methode zum Öffnen / Schließen von Dateien und zum Vermeiden von Speicherlecks:

Vorbereitung:

import numpy as np
import h5py

data_to_write = np.random.random(size=(100,20)) # or some such

Schreiben:

with h5py.File('name-of-file.h5', 'w') as hf:
    hf.create_dataset("name-of-dataset",  data=data_to_write)

Lesen:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]
Lavi Avigdor
quelle
2
Keine Notwendigkeit, Datei zu schließen?
Ricoamor
22
@ DrDeSancho nein, die mit Aussage
Leonid
1
Besonders nützlich, wenn im interaktiven Modus ausgeführt wird (da sonst die Gefahr besteht, dass eine Ausnahme von h5py für eine bereits geöffnete Datei auftritt, wenn derselbe Code erneut ausgeführt wird, ohne beim ersten Versuch ordnungsgemäß geschlossen zu werden)
Andre Holzner
Die withFunktion von Python wird als Kontextmanager bezeichnet. Dadurch wird sichergestellt, dass die Datei nach ihrer Verwendung geschlossen wird. Weitere Informationen finden Sie in der offiziellen Dokumentation zur Verfügung: docs.python.org/3/library/contextlib.html
Mark