【问题标题】:How to create variable length columns in hdf5 file?如何在 hdf5 文件中创建可变长度列?
【发布时间】:2019-12-07 04:01:00
【问题描述】:

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

我想创建具有可变长度的第一列。例如,[1,2,3] 作为列中的第一个条目,[1,2,3,4,5] 作为第二个条目,依此类推,将 HDF5 文件中的其他 5 列保留在同一数据集中,数据类型为 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 列都包含在同一个数据集中,但第一列具有如上所述的可变长度条目。

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

【问题讨论】:

    标签: python-3.x hdf5 h5py


    【解决方案1】:

    我刚刚发布了这个答案,因为它需要一点挖掘(有一个命名的可变长度列)。 您也可以命名为“衣衫褴褛”的列并设置它。像这样:

    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)

    【讨论】:

      【解决方案2】:

      您想要可变长度(参差不齐)的列,还是只需要一个可以容纳数据数组的列(最多 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'])
      

      如果您想要一个可变长度(“参差不齐”)的列,我 99% 确定在数据集中使用特殊 dtype 时您仅限于单个列。另外,我认为您不能命名字段/列。 (我无法让它工作,也找不到任何示例。)
      下面的代码显示了上面修改的示例,将变量列数据放入数据集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])
      

      【讨论】:

      • 谢谢。是的,你是对的,我只希望数据集的第一列具有可变长度(“参差不齐”)。例如,第一个条目为 [1,2,3],第二个条目为 [1,2,3,4,5],依此类推,还有 5 列。所以,总的来说,我应该在数据集中有 6 列,例如我希望 [[1,2,3],45,22,2,2,1] 作为数据集中的条目之一,其中 [1,2,3] 对应于第一列,'45' 作为第二列,'22 ' 作为第 3 列,'2' 作为第 4 列,'2' 作为第 5 列,'1' 作为第 6 列。您提供的第一个代码对于这种类型的输入 ([1,2,3]) 将失败,因为它没有 size=4。那么,你能帮我解决这个问题吗?
      • Aniket,我不认为你能做到你所描述的。 (“我希望所有 6 列都包含在同一个数据集中,第一列具有如上所述的可变长度条目。”)。我找不到任何示例来说明如何使用 h5pypytables 进行操作。根据我的测试,您必须将参差不齐的数组放入 1 个数据集中,将其他(固定大小)数据放入另一个数据集中。或者,如果您知道最大不规则数组的最大大小,则可以将第一列的大小调整为该大小,然后用零填充较小的数组以作为缺失值(并将大小保存为字段)。
      • 感谢您的宝贵回复。我认为你是对的,这不能通过 HDF5 实现。但是,我认为在 Keras 中使用 Masking 层对我的输入进行零填充可以很好地解决这种情况。无论如何,您能否在以下位置查看我关于填充和遮罩的问题:-stackoverflow.com/questions/49670832/… 我想您可以解决这个问题。请帮忙。
      • 我想你的意思是这个问题:how-to-deal-with-variable-length-sequences-in-keras-for-mlp。我阅读并添加了一些 cmets。但是我不熟悉 Keras 中的掩码数组用法。您上面评论中的链接描述了“如何在 Keras 中使用掩码”。
      • @kcw78 我认为您可以这样命名该字段: tmp = h5py.special_dtype(vlen=np.dtype('uint8')) dt = np.dtype([('elements', tmp )]) dset = h5_file.create_dataset("Var Length", shape=(1,), maxshape=(None,), chunks=True, dtype=dt)
      猜你喜欢
      • 1970-01-01
      • 2016-08-04
      • 2013-07-15
      • 2011-03-29
      • 2016-11-06
      • 1970-01-01
      • 2011-12-20
      • 2019-10-28
      • 2021-12-15
      相关资源
      最近更新 更多