web-dev-qa-db-fra.com

Stockage d'une liste de chaînes dans un ensemble de données HDF5 à partir de Python

J'essaie de stocker une liste de chaînes de longueur variable dans un ensemble de données HDF5. Le code pour cela est

import h5py
h5File=h5py.File('xxx.h5','w')
strList=['asas','asas','asas']  
h5File.create_dataset('xxx',(len(strList),1),'S10',strList)
h5File.flush() 
h5File.Close()  

Je reçois une erreur indiquant que "TypeError: aucun chemin de conversion pour dtype: dtype ('& lt U3')" où le & lt signifie réellement moins que le symbole
Comment puis-je résoudre ce problème.

22
gman

Vous lisez des chaînes Unicode, mais spécifiez votre type de données en ASCII. Selon le wiki h5py , h5py ne prend actuellement pas en charge cette conversion.

Vous devrez encoder les chaînes dans un format h5py gère:

asciiList = [n.encode("ascii", "ignore") for n in strList]
h5File.create_dataset('xxx', (len(asciiList),1),'S10', asciiList)

Remarque: tout ce qui est encodé en UTF-8 ne peut pas être encodé en ASCII!

26
SlightlyCuban

Dans HDF5, les données au format VL sont stockées en tant que vecteurs de longueur arbitraire d'un type de base. En particulier, les chaînes sont stockées de style C dans des tampons à terminaison nulle. NumPy n'a pas de mécanisme natif pour prendre en charge cela. Malheureusement, il s'agit de la norme de facto pour représenter les chaînes dans l'API C HDF5 et dans de nombreuses applications HDF5.

Heureusement, NumPy a un type de pointeur générique sous la forme du dtype "objet" ("O"). Dans h5py, les chaînes de longueur variable sont mappées aux tableaux d'objets. Une petite quantité de métadonnées attachées à un dtype "O" indique à h5py que son contenu doit être converti en chaînes VL lorsqu'il est stocké dans le fichier.

Les chaînes VL existantes peuvent être lues et écrites sans effort supplémentaire; Python et les chaînes NumPy de longueur fixe peuvent être converties automatiquement en données VL et stockées.

Exemple

In [27]: dt = h5py.special_dtype(vlen=str)

In [28]: dset = h5File.create_dataset('vlen_str', (100,), dtype=dt)

In [29]: dset[0] = 'the change of water into water vapour'

In [30]: dset[0]
Out[30]: 'the change of water into water vapour'
9
yardstick17

Je suis dans une situation similaire, je souhaite stocker les noms de colonne de la trame de données en tant qu'ensemble de données dans le fichier hdf5. En supposant que df.columns est ce que je veux stocker, j'ai trouvé les œuvres suivantes:

h5File = h5py.File('my_file.h5','w')
h5File['col_names'] = df.columns.values.astype('S')

Cela suppose que les noms de colonne sont des chaînes "simples" qui peuvent être encodées en ASCII.

4
Rajendra Koppula