web-dev-qa-db-ja.com

文字列のリストをPythonからHDF5データセットに保存する

文字列の可変長リストをHDF5データセットに保存しようとしています。このためのコードは

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

"TypeError:dtypeの変換パスがありません:dtype( '&lt U3')"というエラーが表示されます&ltは実際の小なり記号を意味します
どうすればこの問題を解決できますか。

22
gman

Unicode文字列で読み込んでいますが、データ型をASCIIとして指定しています。 h5py wiki によると、h5pyは現在この変換をサポートしていません。

文字列をh5pyハンドルの形式でエンコードする必要があります:

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

注:UTF-8でエンコードされたすべてがASCIIでエンコードできるわけではありません。

26
SlightlyCuban

HDF5では、VL形式のデータは、ベースタイプの任意の長さのベクトルとして格納されます。特に、文字列はCスタイルでnullで終了するバッファに格納されます。 NumPyには、これをサポートするネイティブのメカニズムがありません。残念ながら、これはHDF5 C APIおよび多くのHDF5アプリケーションで文字列を表すための事実上の標準です。

ありがたいことに、NumPyには、「オブジェクト」(「O」)dtypeの形式の汎用ポインター型があります。 h5pyでは、可変長文字列はオブジェクト配列にマップされます。 “ O” dtypeに添付された少量のメタデータは、ファイルに格納されたときにその内容がVL文字列に変換されることをh5pyに伝えます。

既存のVL文字列は、追加の作業なしで読み書きできます。 Python文字列と固定長NumPy文字列は、VLデータに自動変換して保存できます。

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

同様の状況で、データフレームの列名をデータセットとしてhdf5ファイルに保存したいと考えています。 df.columnsが保存したいものであると仮定すると、次の作品が見つかりました。

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

これは、列名がASCIIでエンコードできる「単純な」文字列であることを前提としています。

4