使用vlen和h5py时出现无法解释的行为

时间:2015-05-30 08:01:08

标签: python numpy hdf5 h5py

我正在使用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。

感谢您的帮助

1 个答案:

答案 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.shapenumpy看到的。

当我在字符串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个值,但是为每个子阵列移位。