将可变长度序列写入复合数组
Writing variable-length sequence to a compound array
我在 h5py 中使用复合数据类型,其中一些元素是可变长度数组。我找不到设置项目的方法。下面的 MWE 显示了 6 种不同的方法来做到这一点(顺序索引——无论如何在 h5py 中都不起作用,融合索引,columns/rows 的读取-修改-提交),这两种方法都不起作用。
正确的做法是什么?为什么 h5py 在将整数列表写入 int32
列表时说 Cannot change data-type for object array
?
with h5py.File('/tmp/test-vla.h5','w') as h5:
dt=np.dtype([('a',h5py.vlen_dtype(np.dtype('int32')))])
dset=h5.create_dataset('test',(5,),dtype=dt)
dset['a'][2]=[1,2,3] # does not write the value back
dset[2]['a']=[1,2,3] # does not write the value back
dset['a',2]=[1,2,3] # Cannot change data-type for object array
dset[2,'a']=[1,2,3] # Cannot change data-type for object array
tmp=dset['a']; tmp[2]=[1,2,3]; dset['a']=tmp # Cannot change data-type for object array
tmp=dset[2]; tmp['a']=[1,2,3]; dset[2]=tmp # 'list' object has no attribute 'dtype'
在处理复合数据集时,我发现最好在单个语句中添加所有行数据。我调整了您的代码并展示了如何添加 3 行数据(每行不同长度)。请注意我是如何: 1)用元组定义数据行; 2) 用 np.array()
定义整数列表;和 3) 不要引用字段名称 ['a']
.
with h5py.File('test-vla.h5','w') as h5:
dt=np.dtype([('a',h5py.vlen_dtype(np.dtype('int32')))])
dset=h5.create_dataset('test',(5,),dtype=dt)
print (dset.dtype, dset.shape)
dset[0] = ( np.array([0,1,2]), )
dset[1] = ( np.array([1,2,3,4]), )
dset[2] = ( np.array([0,1,2,3,4]), )
有关详细信息,请查看 HDF5 辅助工具 / h5py 下 HDF 组论坛上的这个 post :
Compound datatype with int, float and array of floats
我在 h5py 中使用复合数据类型,其中一些元素是可变长度数组。我找不到设置项目的方法。下面的 MWE 显示了 6 种不同的方法来做到这一点(顺序索引——无论如何在 h5py 中都不起作用,融合索引,columns/rows 的读取-修改-提交),这两种方法都不起作用。
正确的做法是什么?为什么 h5py 在将整数列表写入 int32
列表时说 Cannot change data-type for object array
?
with h5py.File('/tmp/test-vla.h5','w') as h5:
dt=np.dtype([('a',h5py.vlen_dtype(np.dtype('int32')))])
dset=h5.create_dataset('test',(5,),dtype=dt)
dset['a'][2]=[1,2,3] # does not write the value back
dset[2]['a']=[1,2,3] # does not write the value back
dset['a',2]=[1,2,3] # Cannot change data-type for object array
dset[2,'a']=[1,2,3] # Cannot change data-type for object array
tmp=dset['a']; tmp[2]=[1,2,3]; dset['a']=tmp # Cannot change data-type for object array
tmp=dset[2]; tmp['a']=[1,2,3]; dset[2]=tmp # 'list' object has no attribute 'dtype'
在处理复合数据集时,我发现最好在单个语句中添加所有行数据。我调整了您的代码并展示了如何添加 3 行数据(每行不同长度)。请注意我是如何: 1)用元组定义数据行; 2) 用 np.array()
定义整数列表;和 3) 不要引用字段名称 ['a']
.
with h5py.File('test-vla.h5','w') as h5:
dt=np.dtype([('a',h5py.vlen_dtype(np.dtype('int32')))])
dset=h5.create_dataset('test',(5,),dtype=dt)
print (dset.dtype, dset.shape)
dset[0] = ( np.array([0,1,2]), )
dset[1] = ( np.array([1,2,3,4]), )
dset[2] = ( np.array([0,1,2,3,4]), )
有关详细信息,请查看 HDF5 辅助工具 / h5py 下 HDF 组论坛上的这个 post :
Compound datatype with int, float and array of floats