Lesen von HDF5-Dateien in Python

75

Ich versuche, Daten aus der HDF5-Datei in Python zu lesen. Ich kann die hdf5-Datei mit lesen h5py, aber ich kann nicht herausfinden, wie ich auf Daten in der Datei zugreifen kann.

Mein Code

import h5py    
import numpy as np    
f1 = h5py.File(file_name,'r+')    

Dies funktioniert und die Datei wird gelesen. Aber wie kann ich auf Daten innerhalb des Dateiobjekts zugreifen f1?

Sameer Damir
quelle
1
Wenn die Datei ein Keras-Modell enthält, möchten Sie es wahrscheinlich stattdessen mit Keras laden .
Josiah Yoder
Ist eine hdf5Datei unterscheidet sich von einer hdfDatei? Ich habe hdfs (es sind mehrere Bildbänder), aber ich kann nicht herausfinden, wie ich sie öffnen soll.
Mikey

Antworten:

129

Lesen Sie HDF5

import h5py
filename = "file.hdf5"

with h5py.File(filename, "r") as f:
    # List all groups
    print("Keys: %s" % f.keys())
    a_group_key = list(f.keys())[0]

    # Get the data
    data = list(f[a_group_key])

Schreiben Sie HDF5

import h5py

# Create random data
import numpy as np
data_matrix = np.random.uniform(-1, 1, size=(10, 3))

# Write data to HDF5
with h5py.File("file.hdf5", "w") as data_file:
    data_file.create_dataset("group_name", data=data_matrix)

Weitere Informationen finden Sie in den h5py-Dokumenten .

Alternativen

Für Ihre Anwendung kann Folgendes wichtig sein:

  • Unterstützung durch andere Programmiersprachen
  • Lese- / Schreibleistung
  • Kompaktheit (Dateigröße)

Siehe auch: Vergleich der Datenserialisierungsformate

Wenn Sie eher nach einer Möglichkeit suchen, Konfigurationsdateien zu erstellen, sollten Sie meinen kurzen Artikel Konfigurationsdateien in Python lesen

Martin Thoma
quelle
2
Um die Daten in den HDF5-Datensätzen als Numpy-Array zu erhalten, können Sie dies tunf[key].value
erickrf
1
Ab h5pyVersion 2.1: "Die Eigenschaft Dataset.value, die auf h5py 1.0 zurückgeht, ist veraltet und wird in einer späteren Version entfernt. Diese Eigenschaft speichert das gesamte Dataset in einem NumPy-Array. Code using .valuesollte aktualisiert werden, um die NumPy-Indizierung mit mydataset[...]oder zu verwenden mydataset[()]wie angemessen."
Honey_Badger
Ich benutze Julias HDF5-Bibliothek und der Lesevorgang ist viel schneller (würde ihn als Antwort einschließen, aber OP hat nach Python gefragt). Das gleiche Lesen der hdf5-Datei dauert in h5py ewig, ist jedoch in Julia sehr überschaubar. Es lohnt sich, das Programmieren in Julia nur für dieses eine Problem zu lernen. Das einzige Problem, das ich mit Julia hatte, war, dass es nullterminierte Zeichenfolgen nicht richtig handhabte, was für mich eine Art Straßensperre war.
Demongolem
Wenn Sie die Antwort selbst kommentieren, führt der Listenvorgang in der gelesenen Version dazu, dass Python einfriert. Wenn ich nur f [a_group_key] mache, funktioniert es mit der richtigen Geschwindigkeit.
Demongolem
@demongolem: Sie sollten nicht die Liste aller Schlüssel verwenden, von denen Sie bereits wissen, welche Sie verwenden möchten. Ich habe es hier getan, um ein in sich geschlossenes Beispiel zu haben, das am wenigsten Arbeit erfordert, um etwas zum Laufen zu bringen.
Martin Thoma
19

Sie können Pandas verwenden.

import pandas as pd
pd.read_hdf(filename,key)
Danny
quelle
4
Sie sollten sich nicht auf die Pandas-Implementierung verlassen, es sei denn, Sie speichern Datenrahmen. read_hdf setzt voraus, dass sich die HDF-Datei in einer bestimmten Struktur befindet. Außerdem gibt es kein pd.write_hdf, sodass Sie es nur in eine Richtung verwenden können. Siehe diesen Beitrag .
Max
2
Pandas haben eine Schreibfunktion. Siehe pd.DataFrame.to_hdf
Eric Taw
17

Datei lesen

import h5py

f = h5py.File(file_name, mode)

Untersuchen der Struktur der Datei durch Drucken der vorhandenen HDF5-Gruppen

for key in f.keys():
    print(key) #Names of the groups in HDF5 file.

Daten extrahieren

#Get the HDF5 group
group = f[key]

#Checkout what keys are inside that group.
for key in group.keys():
    print(key)

data = group[some_key_inside_the_group].value
#Do whatever you want with data

#After you are done
f.close()
Daksh
quelle
for key in data.keys(): print(key) #Names of the groups in HDF5 file.Dies kann ersetzt werden durchlist(data)
Hitesh
4
um genaue Struktur mit allen variablen Verwendung zu kennen:data.visit(print)
Hitesh
Nur zu Ihrer Information, das f in h5py.File (...) sollte groß geschrieben werden.
Dannykim
1
@dannykim Fertig.
Daksh
2
Wichtig: data.close()wird am Ende benötigt.
Anilbey
6

Hier ist eine einfache Funktion, die ich gerade geschrieben habe und die eine .hdf5-Datei liest, die von der Funktion save_weights in Keras generiert wurde, und ein Diktat mit Ebenennamen und Gewichten zurückgibt:

def read_hdf5(path):

    weights = {}

    keys = []
    with h5py.File(path, 'r') as f: # open file
        f.visit(keys.append) # append all keys to list
        for key in keys:
            if ':' in key: # contains data if ':' in key
                print(f[key].name)
                weights[f[key].name] = f[key].value
    return weights

https://gist.github.com/Attila94/fb917e03b04035f3737cc8860d9e9f9b .

Ich habe es nicht gründlich getestet, mache aber den Job für mich.

Attila
quelle
Diese Funktion scheint den gesamten Inhalt der .h5-Datei anzuzeigen. Vielen Dank.
minTwin
3

Um den Inhalt der .hdf5-Datei als Array zu lesen, können Sie folgende Schritte ausführen

> import numpy as np 
> myarray = np.fromfile('file.hdf5', dtype=float)
> print(myarray)
Raza
quelle
3

Verwenden Sie den folgenden Code, um Daten zu lesen und in ein Numpy-Array umzuwandeln

import h5py
f1 = h5py.File('data_1.h5', 'r')
list(f1.keys())
X1 = f1['x']
y1=f1['y']
df1= np.array(X1.value)
dfy1= np.array(y1.value)
print (df1.shape)
print (dfy1.shape)
aschiges Bansal
quelle
1
Vergessen Sie nicht, die Datei zu schließen, da sie sonst beschädigt werden kann.
Anilbey
2
from keras.models import load_model 

h= load_model('FILE_NAME.h5')
Judice
quelle
1
So laden wir ein gespeichertes NN-Modell in Keras. Ich denke, diese Frage ist allgemeiner und hat nichts mit Keras zu tun.
Upul Bandara
Wenn du nur einen Hammer hast, sieht alles aus wie ein Nagel :-).
Upul Bandara
1

Sie müssen lediglich einen Datensatz erstellen. Wenn Sie sich die Kurzanleitung ansehen, sehen Sie, dass Sie das Dateiobjekt verwenden müssen, um ein Dataset zu erstellen. Also, f.create_datasetund dann können Sie die Daten lesen. Dies wird in den Dokumenten erklärt .

Spiele Brainiac
quelle
0

Mit Hilfe von Antworten aus dieser Frage und dem neuesten Dokument konnte ich meine numerischen Arrays mit extrahieren

import h5py
with h5py.File(filename, 'r') as h5f:
    h5x = h5f[list(h5f.keys())[0]]['x'][()]

Wo 'x'ist in meinem Fall einfach die X-Koordinate?

Patol75
quelle
0

Wenn Sie Datensätze in der HDF-Datei benannt haben, können Sie diese Datensätze mit dem folgenden Code lesen und in numpy-Arrays konvertieren:

import h5py
file = h5py.File('filename.h5', 'r')

xdata = file.get('xdata')
xdata= np.array(xdata)

Wenn sich Ihre Datei in einem anderen Verzeichnis befindet, können Sie den Pfad vor hinzufügen 'filename.h5'.

Machzx
quelle