web-dev-qa-db-fra.com

Tableaux numpy d'entrée et de sortie en h5py

J'ai un code Python dont le résultat est un enter image description here matrice dimensionnée, dont les entrées sont toutes du type float. Si je le sauvegarde avec l'extension .dat la taille du fichier est de l’ordre de 500 MB. J'ai lu cela en utilisant h5py réduit considérablement la taille du fichier. Donc, disons que j'ai le tableau 2D numpy nommé A. Comment l'enregistrer dans un fichier h5py? Aussi, comment lire le même fichier et le placer en tant que tableau numpy dans un code différent, car je dois effectuer des manipulations avec le tableau?

84
lovespeed

h5py fournit un modèle de ensembles de données et de groupes . Le premier est fondamentalement des tableaux et le dernier que vous pouvez considérer comme des répertoires. Chacun est nommé. Vous devriez consulter la documentation de l'API et des exemples:

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

Un exemple simple dans lequel vous créez toutes les données à l’avance et que vous voulez simplement enregistrer dans un fichier hdf5 ressemblerait à quelque chose comme:

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()

Vous pouvez ensuite charger ces données en utilisant:

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

Vérifiez certainement la documentation:

http://docs.h5py.org

L'écriture dans un fichier hdf5 dépend de h5py ou de pytables (chacune a un python différente qui se trouve au-dessus de la spécification du fichier hdf5). Vous devriez également jeter un coup d'œil aux autres formats binaires simples fournis par numpy nativement tel que np.save, np.savez etc:

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

119
JoshAdel

méthode plus propre pour gérer l'ouverture/la fermeture des fichiers et éviter les fuites de mémoire:

Prep:

import numpy as np
import h5py

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

Écrire:

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

Lecture:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]
86
Lavi Avigdor