我正在使用h5py来构建数据集。由于我想存储具有不同#of rows维度的数组,因此我使用h5py special_type vlen。但是,我遇到了无法解释的行为,也许你可以帮我理解发生的事情:
>>>> import h5py
>>>> import numpy as np
>>>> fp = h5py.File(datasource_fname, mode='w')
>>>> dt = h5py.special_dtype(vlen=np.dtype('float32'))
>>>> train_targets = fp.create_dataset('target_sequence', shape=(9549, 5,), dtype=dt)
>>>> test
Out[130]:
array([[ 0., 1., 1., 1., 0., 1., 1., 0., 1., 0., 0.],
[ 1., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1.]])
>>>> train_targets[0] = test
>>>> train_targets[0]
Out[138]:
array([ array([ 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 1.], dtype=float32),
array([ 1., 0., 0., 0., 1., 0., 0., 0., 0., 1., 0.], dtype=float32),
array([ 0., 0., 0., 1., 0., 0., 0., 0., 1., 0., 0.], dtype=float32),
array([ 0., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0.], dtype=float32),
array([ 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0.], dtype=float32)], dtype=object)
我希望train_targets[0]
具有这种形状,但我无法识别数组中的行。他们似乎完全混淆,但它是一致的。我的意思是每次尝试上面的代码时,train_targets[0]
看起来都是一样的。
澄清一下:我的train_targets
中的第一个元素test
的形状为(5,11)
,但第二个元素的形状可能为(5,38)
,这就是为什么我用vlen。
感谢您的帮助
垫
答案 0 :(得分:1)
我认为
train_targets[0] = test
已将(11,5)
数组存储为F
行中的train_targets
有序数组。根据{{1}}形状,这是一行5个元素。由于它是(9549,5)
,因此每个元素都是长度为11的1d数组。
您在vlen
中获得的内容 - 一个包含5个数组的数组,每个数组train_targets[0]
,其值取自(11,)
(F阶)。
所以我认为有两个问题 - 二维形状意味着什么,以及vlen允许什么。
我的test
版本是v2.3之前的版本,因此我只获得字符串vlen。但我怀疑你的问题可能是h5py
仅适用于1d数组,可以说是字节串的扩展。
vlen
中的5
是否与shape=(9549, 5,)
中的5
有任何关系?我不这么认为,至少不是test.shape
和numpy
看到的。
当我在字符串vlen示例之后创建文件时:
h5py
然后执行:
>>> f = h5py.File('foo.hdf5')
>>> dt = h5py.special_dtype(vlen=str)
>>> ds = f.create_dataset('VLDS', (100,100), dtype=dt)
并查看ds[0]='this one string'
,我得到一个包含100个元素的对象数组,每个元素都是这个字符串。也就是说,我已经设置了整行ds[0]
。
ds
是设置一个元素的正确方法。
ds[0,0]='another'
是可变长度',而不是'变量形状'。虽然https://www.hdfgroup.org/HDF5/doc/TechNotes/VLTypes.html文档对此并不完全清楚,但我认为您可以存储形状vlen
和(11,)
和(38,)
的1d数组,但不能存储2d数组。
实际上,vlen
输出复制为:
train_targets
它取自转置(F顺序)的11个值,但是为每个子阵列移位。