如何在 hdf5 文件中创建可变长度的列?

How to create variable length columns in hdf5 file?

我正在使用 h5py 包为我的训练集创建 HDF5 文件。

我想创建具有可变长度的第一列。例如,[1,2,3] 作为列中的第一个条目,[1,2,3,4,5] 作为第二个条目,依此类推,将其他 5 列留在 HDF5 文件中数据类型为 int 的同一数据集中固定长度,即 1.

我已尝试使用以下代码语句来解决此类情况:

dt = h5py.special_dtype(vlen=np.dtype('int32'))
datatype = np.dtype([('FieldA', dt), ('FieldB', dt1), ('FieldC', dt1), ('FieldD', dt1), ('FieldE', dt1), ('FieldF', dt1)])

但是,在输出中,对于该数据集的上述每一列,我只得到空数组。

而且,当我尝试以下代码时:

dt = h5py.special_dtype(vlen=np.dtype('int32'))
data = db.create_dataset("data1", (5000,), dtype=dt)

这只为我提供了数据集中具有可变长度条目的一列,但我希望所有这 6 列都包含在同一数据集中,但第一列具有如上所述的可变长度条目。

我完全不知道如何为这种情况找到解决方案。任何帮助将不胜感激。

您想要可变长度(参差不齐)的列,还是只需要一个可以容纳数据数组(最多 dtype 限制)的列?第二个非常简单。请参阅下面的代码。 (这是一个简单的例子,有 2 个字段来演示该方法。)

my_dt = np.dtype([('FieldA', 'int32', (4,)), ('FieldB', 'int32') ] )


with h5py.File('SO_57260167.h5','w') as h5f :

    data = h5f.create_dataset("testdata", (10,), dtype=my_dt)

    for cnt in range(10) :
        arr = np.random.randint(1,1000,size=4)
        print (arr)
        data[cnt,'FieldA']=arr
        data[cnt,'FieldB']=arr[0]
        print (data[cnt]['FieldB'])

如果您想要可变长度 ("ragged") 列,我 99% 确定在数据集中使用特殊数据类型时您只能使用单个列。另外,我认为您无法命名 fields/columns。 (我无法让它工作,也找不到任何示例。)
下面的代码显示了上面修改后的示例,将可变列数据放在数据集 vl_data 中,将其余整数数据放在数据集 fx_data.

vl_dt = h5py.special_dtype(vlen=np.dtype('int32'))
my_dt = np.dtype([('FieldB', 'int32'), ('FieldC', 'int32'), ('FieldD', 'int32'), 
                  ('FieldE', 'int32'), ('FieldF', 'int32')])

with h5py.File('SO_57260167_vl.h5','w') as h5f :

    vl_data = h5f.create_dataset("testdata_vl", (10,), dtype= vl_dt)
    fx_data = h5f.create_dataset("testdata", (10,), dtype=my_dt )

    for cnt in range(10) :
        arr = np.random.randint(1,1000,size=cnt+2)
#        print (arr)
        vl_data[cnt]=arr
        print (vl_data[cnt])
        fx_data[cnt,'FieldB']=arr[0]
        fx_data[cnt,'FieldF']=arr[-1]
        print (fx_data[cnt])

我刚刚发布了这个答案,因为它需要一点挖掘(有一个命名的可变长度列)。 您还可以命名为“参差不齐”的列并进行设置。像这样:

dt = h5py.special_dtype(vlen=np.dtype('int32'))
dset = h5_file.create_dataset("some_data", shape=(2,), maxshape=(None,), chunks=True, dtype=np.dtype([('name_var_lngth',dt),]))
array_test = np.array([1,2,3,4,5], np.dtype('int32'))
dset[0]= (array_test,)
array_test = np.array([1,2,3,4,5,6], np.dtype('int32'))
dset[1]= (array_test,)

设置一个字段不行,只能像别人观察的那样设置整条记录: Writing to compound dataset with variable length string via h5py (HDF5)