J'ai un fichier h5 contenant plusieurs groupes et ensembles de données. Chaque ensemble de données a des attributs associés. Je veux trouver / filtrer les ensembles de données dans ce fichier h5 en fonction de l'attribut respectif qui lui est associé.
Exemple:
dataset1 =cloudy(attribute) dataset2 =rainy(attribute) dataset3 =cloudy(attribute)
Je veux pour trouver les ensembles de données ayant l'attribut / métadonnées météo
comme cloudy
Quelle sera l'approche la plus simple pour y parvenir en pythonic strong > chemin.
3 Réponses :
Vous pouvez obtenir directement les ensembles de données à partir du fichier h5 de la manière ci-dessous. Disons que vous avez un fichier.h5, vous pouvez l'utiliser pour filtrer le contenu de la manière pythonique ci-dessous.
if data.['dataset3'].has_key('cloudy') == 1:
Maintenant, les données sont un objet qui pourrait être utilisé dans un dictionnaire. Si vous voulez les attributs alors
data.['dataset1']['cloudy'] data.['dataset2']['rainy'] data.['dataset3']['cloudy']
Cela récupérera tous les attributs de données dans les fichiers h5 .. Dans votre cas dataset1, dataset2, dataset3
Encore une fois les ensembles de données individuels sont à nouveau sous la forme d'un dictionnaire. Donc,
data.['dataset3'].keys()
Cela sera nuageux, et ainsi de suite s'il y en a
data.['dataset2'].keys()
Cela deviendra pluvieux, et ainsi de suite s'il existe
data.['dataset1'].keys()
Cela va chercher des nuages, et ainsi de suite s'il existe
Si vous voulez utiliser ces données, essayez simplement d'y accéder en tant que dict
data.keys()
Une fois que vous connaissez les clés, vous pouvez rechercher les clés requises simplement en utilisant la méthode has_key ()
import h5py import numpy data = h5py.File('a.h5', 'r')
Ensuite, ajoutez le données sur la variable requise. Le plus simple est de les convertir en tableaux numpy.
Il existe deux façons d'accéder aux données HDF5 avec Python: h5py et pytables . Les deux sont bons, avec des capacités différentes:
Lorsque vous travaillez avec des données HDF5, il est important de comprendre le modèle de données HDF5. Cela dépasse le cadre de cet article. Par souci de simplicité, considérez le modèle de données comme un système de fichiers; où "groupes" et "ensembles de données" sont comme des "dossiers" et des "fichiers". Les deux peuvent avoir des attributs. "nœud" est le terme utilisé pour désigner un "groupe" ou un "ensemble de données".
@Kiran Ramachandra a décrit une méthode avec h5py
. Puisque vous avez tagué votre message avec pytables
, décrit ci-dessous est le même processus avec pytables
.
Remarque: l'exemple de Kiran suppose que les ensembles de données 1,2,3 tout cela au niveau racine. Vous avez dit que vous aviez également des groupes. Vos groupes ont probablement également des ensembles de données. Vous pouvez utiliser l'utilitaire HDFView pour afficher le modèle de données et vos données.
import tables as tb import numpy as np h5f = tb.open_file('a.h5','w') #create dataset 1 at root level, and assign attribute ds_dtype = np.dtype([('a',int),('b',float)]) dataset1 = h5f.create_table(h5f.root, 'dataset1', description=ds_dtype) dataset1._f_setattr('cloudy', 'True') #create a group at root level h5f.create_group(h5f.root, 'agroup') #create dataset 2,3 at root.agroup level, and assign attributes dataset2 = h5f.create_table(h5f.root.agroup, 'dataset2', description=ds_dtype) dataset2._f_setattr('rainy', 'True') dataset3 = h5f.create_table(h5f.root.agroup, 'dataset3', description=ds_dtype) dataset3._f_setattr('cloudy', 'True') h5f.close()
Cela vous donne un objet fichier que vous utilisez pour accéder à des objets supplémentaires (groupes ou ensembles de données).
ds2_attrs = h5f.root.agroup.dataset2._v_attrs._v_attrnames for attr_name in ds2_attrs : print ('Attribute', attr_name,'=' , h5f.root.agroup.dataset2._f_getattr(attr_name))
C'est un objet itérable pour les nœuds et les sous-nœuds, et donne la structure complète des données HDF5 (rappelez-vous que les «nœuds» peuvent être des groupes et des ensembles de données). Vous pouvez lister tous les nœuds et types avec:
h5f.root.agroup.dataset2._f_getattr('rainy')
Utilisez ce qui suit pour obtenir (une liste Python non récursive) des noms de nœuds:
ds1_attrs = h5f.root.dataset1._v_attrs._v_attrnames for attr_name in ds1_attrs : print ('Attribute', attr_name,'=' ,h5f.root.dataset1._f_getattr(attr_name))
Merci, mais pouvez-vous s'il vous plaît aider pour la requête ci-dessous
Ceci est une modification du code de Sumit (affiché dans sa réponse).
Remarque: j'ai supprimé l'instruction f.close ()
après les appels create_group
et create_dataset
. Une fois les attributs ajoutés, la dernière section de code les récupère (et affiche le nom / la valeur de l'attribut sous les noms de groupe / ensemble de données).
For my_group1 . my_dataset11 : env = cloudy temp= 25 For my_group1 . my_dataset12 : env = cloudy temp= 25 For my_group1 . my_dataset13 : env = cloudy temp= 25 For my_group2 . my_dataset21 : env = rainy temp= 20 For my_group2 . my_dataset22 : env = rainy temp= 20 For my_group2 . my_dataset23 : env = rainy temp= 20
La sortie doit ressembler à ceci:
import h5py dat=[1,2,3,45] with h5py.File('temp.h5', 'w') as f: group1 = f.create_group('my_group1') dset11 = group1.create_dataset('my_dataset11', data=dat, compression=9) dset12 = group1.create_dataset('my_dataset12', data=dat, compression=9) dset13 = group1.create_dataset('my_dataset13', data=dat, compression=9) group2 = f.create_group('my_group2') dset21 = group2.create_dataset('my_dataset21', data=dat, compression=9) dset22 = group2.create_dataset('my_dataset22', data=dat, compression=9) dset23 = group2.create_dataset('my_dataset23', data=dat, compression=9) groups=list(f.keys()) grp=f[groups[0]] dataset=list(grp.keys()) for each in dataset: grp[each].attrs['env']='cloudy' grp[each].attrs['temp']=25 # grp[each]._f_setattr('cloudy', 'True') grp=f[groups[1]] dataset=list(grp.keys()) for each in dataset: grp[each].attrs['env']='rainy' grp[each].attrs['temp']=20 # grp[each]._f_setattr('rainy', 'True') for each_grp in groups: dataset=list(f[each_grp].keys()) for each_ds in dataset: print ('For ', each_grp, '.', each_ds,':') print ('\tenv =', f[each_grp][each_ds].attrs['env']) print ('\ttemp=',f[each_grp][each_ds].attrs['temp']) f.close()
Les réponses ci-dessous sont un bon point de départ. De là, vous devriez consulter la documentation pytables et h5py. J'ai utilisé les deux et ils sont à la fois bien écrits et très utiles (il existe des tutoriels et des références pour les méthodes et les attributs). Pytables ici: pytables.org/usersguide/index.html et h5py ici: docs.h5py.org/en/stable