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

101

J'ai un code Python dont la sortie est une entrez la description de l'image icimatrice dimensionnée, dont les entrées sont toutes du type float. Si je l'enregistre avec l'extension, .datla taille du fichier est de l'ordre de 500 Mo. J'ai lu que l'utilisation h5pyréduit considérablement la taille du fichier. Donc, disons que j'ai nommé le tableau numpy 2D A. Comment l'enregistrer dans un fichier h5py? Aussi, comment lire le même fichier et le mettre sous forme de tableau numpy dans un code différent, car je dois faire des manipulations avec le tableau?

amour
la source
4
Comment l'enregistrez-vous avec l' .datextension?
jorgeca
@jorgeca: pour ça je viens de fairenp.savetxt("output.dat",A,'%10.8e')
lovespeed
3
Merci (l'extension seule ne veut pas dire grand chose, elle pourrait être stockée en binaire, ascii ...). À moins que vous n'ayez besoin des fonctionnalités supplémentaires de hdf5, j'utiliserais simplement np.save('output.dat', A)ce qui l'enregistrera dans un format binaire (beaucoup plus rapide, beaucoup moins d'espace utilisé).
jorgeca
@jorgeca mais un autre script python pourra-t-il le lire comme un tableau 2D quand je l'appelle commeA = np.loadtxt('output.dat',unpack=True)
lovespeed
2
alors h5pyne crée- t- il pas des fichiers plus petits que ceux np.save-là? est h5pyplus rapide que np.savepour les tableaux de la taille indiquée dans la question?
dbliss

Réponses:

132

h5py fournit un modèle d' ensembles de données et de groupes . Le premier est essentiellement des tableaux et le second 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 où vous créez toutes les données à l'avance et que vous souhaitez simplement les 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 recharger 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

Consultez certainement les documents:

http://docs.h5py.org

L'écriture dans le fichier hdf5 dépend de h5py ou de pytables (chacun a une API python différente qui se trouve au-dessus de la spécification du fichier hdf5). Vous devriez également jeter un oeil à d'autres formats binaires simples fournis par numpy nativement tels que np.save, np.savezetc:

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

JoshAdel
la source
Btw. si vous ne connaissez pas le nom de l'ensemble de données à l'avance lors de la lecture, vous devez analyser le fichier hdf comme ici .
Trilarion
@JoshAdel si je souhaite ajouter une colonne à l'ensemble de données. mon ensemble de données est un np.array multidimensionnel indexé comme [img_id, rows, colums, channels]. et je l'ai sauvegardé en utilisant la méthode décrite dans votre réponse. J'accède à tous les points de l'ensemble de données en utilisant h5f ['dataset_1'] [img_id]. ce que je veux, c'est un moyen d'ajouter une autre colonne, dites «ma colonne» ... correspondant à chaque img_id dans l'ensemble de données. comment dois-je ajouter une autre colonne à ceci pour que je puisse faire h5f ['mycolumn'] [img_id]?
iratzhash
Si j'écris des matrices comme celle-ci, je ne peux pas les voir avec HDFView 2.11 - Je peux ouvrir le fichier, je peux voir que l'ensemble de données data.h5existe, mais je ne peux pas le voir avec HDFView. Je peux lire le contenu avec h5py, mais pas l'inspecter avec HDFView. Une idée pourquoi?
Martin Thoma
105

Une façon plus propre de gérer l'ouverture / la fermeture des fichiers et d'éviter les fuites de mémoire:

Préparation:

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)

Lis:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]
Lavi Avigdor
la source
2
Pas besoin de fermer le dossier?
ricoamor
23
@DrDeSancho non, la déclaration avec
Leonid
1
particulièrement utile lors de l'exécution en mode interactif (car sinon on risque d'obtenir une exception de h5py à propos d'un fichier déjà ouvert quand on réexécute le même code sans fermer correctement à la première tentative)
Andre Holzner
La withfonctionnalité de Python est connue sous le nom de gestionnaire de contexte. Il s'assurera que le fichier est fermé après son utilisation. Plus d'informations sont disponibles dans la documentation officielle: docs.python.org/3/library/contextlib.html
Mark le