使用不同大小的 h5py 数组保存

Posted

技术标签:

【中文标题】使用不同大小的 h5py 数组保存【英文标题】:Saving with h5py arrays of different sizes 【发布时间】:2016-09-09 21:57:46 【问题描述】:

我正在尝试使用 HDF5 数据格式存储大约 3000 个 numpy 数组。数组长度从 5306 到 121999 np.float64

我得到 Object dtype dtype('O') has no native HDF5 equivalent 错误,因为由于数据的不规则性,numpy 使用通用对象类。

我的想法是将所有数组填充到 121999 长度并将大小存储在另一个数据集中。

但是这在空间上似乎效率很低,有没有更好的方法?

编辑:澄清一下,我想存储 3126 个 dtype = np.float64 数组。我将它们存储在 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

【问题讨论】:

您是要保存一个包含 3000 个子数组(带有 dtype 对象)的数组,还是 3000 个数组,每个数组都带有 dtype float?举一个 2 或 3 个数组的小例子。 我在编辑中澄清了它 arrsh5py 无法保存的对象数组。您必须将abc 保存为单独的datasets。这些数组将是 datagroup 的元素,您可以使用字典接口与组。 【参考方案1】:

看起来你尝试了类似的东西:

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

【讨论】:

嗨,你能解释一下kv吗? 字典 items() 产生 key value 对的元组。【参考方案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)

仅适用于一维数组,https://github.com/h5py/h5py/issues/876

【讨论】:

以上是关于使用不同大小的 h5py 数组保存的主要内容,如果未能解决你的问题,请参考以下文章

H5PY 键读取速度慢

使用 h5py 从 h5 文件中的同一组中读取多个数据集

H5PY键读取缓慢

如何将不同大小的numpy数组列表保存到磁盘?

h5py 可以从内存中的字节数组加载文件吗?

使用 h5py 沿新轴将数据添加到现有 h5py 文件