如何在 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)
我正在使用 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)