HDF5データ形式を使用して、約3000のnumpy配列を格納しようとしています。配列の長さは5306から121999までさまざまですnp.float64
データの不規則な性質のため、numpyは一般的なオブジェクトクラスを使用しているため、Object dtype dtype('O') has no native HDF5 equivalent
エラーが発生します。
私のアイデアは、すべての配列を121999の長さにパディングし、そのサイズを別のデータセットに格納することでした。
しかし、これはスペースではかなり非効率的ですが、もっと良い方法はありますか?
編集:明確にするために、dtype = np.float64
の3126配列を保存します。それらをlist
に格納し、h5pyがルーチンを実行すると、長さが異なるため、dtype = object
の配列に変換します。それを説明するには:
a = np.array([0.1,0.2,0.3],dtype=np.float64)
b = np.array([0.1,0.2,0.3,0.4,0.5],dtype=np.float64)
c = np.array([0.1,0.2],dtype=np.float64)
arrs = np.array([a,b,c]) # This is performed inside the h5py call
print(arrs.dtype)
>>> object
print(arrs[0].dtype)
>>> float64
次のようなものを試したようです:
In [364]: f=h5py.File('test.hdf5','w')
In [365]: grp=f.create_group('alist')
In [366]: grp.create_dataset('alist',data=[a,b,c])
...
TypeError: Object dtype dtype('O') has no native HDF5 equivalent
ただし、代わりに配列を個別のデータセットとして保存すると、機能します。
In [367]: adict=dict(a=a,b=b,c=c)
In [368]: for k,v in adict.items():
grp.create_dataset(k,data=v)
.....:
In [369]: grp
Out[369]: <HDF5 group "/alist" (3 members)>
In [370]: grp['a'][:]
Out[370]: array([ 0.1, 0.2, 0.3])
グループ内のすべてのデータセットにアクセスするには:
In [389]: [i[:] for i in grp.values()]
Out[389]:
[array([ 0.1, 0.2, 0.3]),
array([ 0.1, 0.2, 0.3, 0.4, 0.5]),
array([ 0.1, 0.2])]
可変長の内部配列のクリーンメソッド: http://docs.h5py.org/en/latest/special.html?highlight=dtype#arbitrary-vlen-data
hdf5_file = h5py.File('yourdataset.hdf5', mode='w')
dt = h5py.special_dtype(vlen=np.dtype('float64'))
hdf5_file.create_dataset('dataset', (3,), dtype=dt)
hdf5_file['dataset'][...] = arrs
print (hdf5_file['dataset'][...])
>>>array([array([0.1,0.2,0.3],dtype=np.float64),
>>>array([0.1,0.2,0.3,0.4,0.5],dtype=np.float64,
>>>array([0.1,0.2],dtype=np.float64], dtype=object)
1D配列でのみ機能します https://github.com/h5py/h5py/issues/876