python - 使用 h5py 保存混合结构化数据
问题描述
我有一个包含 100,000 个条目的数据集,每个条目的形式为:
{
attr1 float[300]
attr2 float[300]
attr3 float[300]
attr4 float
attr5 float
attr6 float
}
.hdf5
将其存储在文件中的最有效方法是什么?
解决方案
如果没有您的数据(和数据结构)或代码示例,就很难提供针对您的问题的示例。我创建了一个显示基本操作的 PyTables 示例。定义表结构和输入数据的方法有很多种。我喜欢np.dtype
用description=
. 在此示例中,我使用具有一个元组的列表逐行创建和添加数据。但是,如果您拥有所有数据,则可以创建一个 NumPy 结构化数组并使用obj=
参数进行引用。这将创建数组并一次性填充所有内容
这是 PyTables 示例,其中包含 100 行和大小为 10 个元素的 attr1/2/3 数组。它显示了逻辑。您可以修改以增加行数和数组元素。
这里解释了所有 PyTables 表方法:
PyTables 表方法
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]
推荐阅读
- facebook - og:image URL 错误:https://mydomain/session/upload/undefined 无法作为图像处理,因为它具有无效的内容类型
- windows - 剪贴板:无法将已注册的剪贴板格式枚举为本地系统
- azure-ad-b2c-custom-policy - 注册时的 MFA 和 ForeReseetPassword 仅登录
- python - 我们可以在python的if-else语句中使用break语句吗
- python - 需要帮助从具有时间线和计数的字典列表中提取数据
- java - 如何从 JPA 中的两个表值中删除数据?
- react-native - 模拟反应导航共享元素的正确方法
- c++ - 万花筒教程找不到头文件`ExecutorProcessControl.h`
- amazon-dynamodb - 查询 DynamoDB GSI 以查找匹配子字符串的选项有哪些?
- javascript - 如何在 d3.js 中使用 .scale 和 .translate?