Python 使用不同大小的h5py阵列保存
我正在尝试使用HDF5数据格式存储大约3000个numpy阵列。数组的长度从5306到121999 np.64不等 我越来越Python 使用不同大小的h5py阵列保存,python,arrays,numpy,hdf5,h5py,Python,Arrays,Numpy,Hdf5,H5py,我正在尝试使用HDF5数据格式存储大约3000个numpy阵列。数组的长度从5306到121999 np.64不等 我越来越 Object dtype dtype('O')没有本地HDF5等效项 错误,因为数据的不规则性numpy使用常规对象类 我的想法是将所有数组填充到121999长度,并将大小存储在另一个数据集中 然而这在空间上似乎效率很低,有更好的方法吗 编辑:为了澄清,我想存储3126个dtype=np.float64数组。我将它们存储在列表中,当h5py执行例程时,它将转换为dtype
Object dtype dtype('O')没有本地HDF5等效项
错误,因为数据的不规则性numpy使用常规对象类
我的想法是将所有数组填充到121999长度,并将大小存储在另一个数据集中
然而这在空间上似乎效率很低,有更好的方法吗
编辑:为了澄清,我想存储3126个dtype=np.float64
数组。我将它们存储在列表中
,当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])
可变长度内部阵列的清理方法:
仅适用于1D阵列,您是要保存一个包含3000个子阵列(使用dtype对象)的阵列,还是要保存3000个阵列,每个阵列都使用dtype float?举一个有2个或3个数组的小例子。我在编辑
arrs
中阐明了它是一个对象数组,它h5py
无法保存。您必须将a
、b
、c
保存为单独的数据集。这些数组将是数据组
的元素,您可以使用组的字典接口。您好,您能解释一下k
和v
吗?字典items()
生成键
值
对的元组。
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])]
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)