使用h5py保存混合结构化数据

问题描述 投票:-1回答:1

我有一个包含100,000个条目的数据集,每种形式:

{
attr1 float[300]
attr2 float[300]
attr3 float[300]
attr4 float
attr5 float
attr6 float
}

将其存储在.hdf5文件中最有效的方法是什么?

python hdf5 h5py pytables
1个回答
0
投票

没有您的数据(和数据结构)或代码示例,很难提供特定于您问题的示例。我创建了一个PyTables示例,该示例显示了基本操作。有很多方法来定义表结构和输入数据。我喜欢创建一个np.dtype并使用description=进行引用。在此示例中,我使用具有一个元组的列表逐行创建和添加数据。但是,如果拥有所有数据,则可以创建一个Numpy结构化数组并使用obj=参数进行引用。这将创建数组并一次性填充所有内容

这里是PyTables示例,其中包含100行和attr1 / 2/3数组,大小为10个元素。它显示了逻辑。您可以修改以增加行和数组元素的数量。

这里解释了所有的PyTables表方法:PyTables table methods

import tables as tb
import numpy as np

attr1  = np.arange(10.)
attr2  = 2.0*np.arange(10.)
attr3  = 3.0*np.arange(10.)
attr4  = 4.0
attr5  = 5.0
attr6  = 6.0

ds_dt = np.dtype({'names':['attr1', 'attr2', 'attr3',
                           'attr4', 'attr5', 'attr6'],
                  'formats':[(float,10), (float,10), (float,10),
                              float, float, float ] }) 

with tb.File('SO_58674120_tb.h5','w') as h5f:

     tb1 = h5f.create_table('/','my_ds', description=ds_dt)
     for rcnt in range(1,100):
         data_list = [ (rcnt*attr1, rcnt*attr2, rcnt*attr3,
                        rcnt*attr4, rcnt*attr5, rcnt*attr6), ]
         tb1.append(data_list)

您可以使用h5py执行相同的操作。过程相似,但有区别。例如,您必须使用shape=调整数据集的大小,如果要将来扩展数据集,则必须添加maxshape=。另外,我只知道如何通过引用numpy数组(而不是像PyTables这样的列表)来添加数据。因此,我创建了recarr来保存中间数据。同样,如果您拥有所有数据,则不必逐行加载。

请参见下面的代码:

import h5py
import numpy as np

attr1  = np.arange(10.)
attr2  = 2.0*np.arange(10.)
attr3  = 3.0*np.arange(10.)
attr4  = 4.0
attr5  = 5.0
attr6  = 6.0

ds_dt = np.dtype({'names':['attr1', 'attr2', 'attr3',
                           'attr4', 'attr5', 'attr6'],
                  'formats':[(float,10), (float,10), (float,10),
                              float, float, float ] }) 
recarr = np.empty((1,), dtype=ds_dt)

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

     h5f.create_dataset('my_ds', dtype=ds_dt, shape=(100,), maxshape=(None) )
     for rcnt in range(1,100):
         recarr['attr1']= rcnt*attr1
         recarr['attr2']= rcnt*attr2
         recarr['attr3']= rcnt*attr3
         recarr['attr4']= rcnt*attr4
         recarr['attr5']= rcnt*attr5
         recarr['attr6']= rcnt*attr6
         h5f['my_ds'][rcnt] = recarr[0]
© www.soinside.com 2019 - 2024. All rights reserved.