gpt4 book ai didi

python - h5py:如何组织 HDF5 文件以有效读取混合数据类型对象

转载 作者:行者123 更新时间:2023-12-01 06:40:22 25 4
gpt4 key购买 nike

我目前正在使用 python3.x 并使用 h5py 库来写入/读取 HDF5 文件。

假设我有大量包含混合数据类型属性的元素。我想将它们存储在 HDF5 文件中,以便可以通过索引尽可能高效地读取单个元素。

举个例子,假设我有以下数据:

item_1 = {'string_name': 'Paul', 'float_height': 5.9, 'int_age':27, 'numpy_data': np.array([5.4, 6.7, 8.8])}
item_2 = {'string_name': 'John', 'float_height': 5.7, 'int_age':31, 'numpy_data': np.array([3.1, 58.4, 66.4])}
...
item_1000000 = {'string_name': 'Anna', 'float_height': 6.1, 'int_age':33, 'numpy_data': np.array([4.7, 5.1, 4.2])}

我发现的最简单的解决方案是将每个属性存储在单独的数组中,然后将每个数组单独存储在 HDF5 文件中。

string_names = ['Paul', 'John', ... , 'Anna']
float_heights = [5.9, 5.7, ... , 6.1]
int_ages = [27, 31, ... , 33]
numpy_data = big_numpy_array_of_shape_1000000_by_3

然后,作为示例,要检索第三个元素,我必须读取四个数组中每个数组的索引“2”处的元素。

这个解决方案工作得很好,但我猜测这是一个非常低效的解决方案,因为需要四个读取操作来检索每个元素。

有什么建议吗?

最佳答案

正如 @hpaulj 指出的,关键是在创建数据集时创建记录数组(和/或数据类型)和引用。有很多方法可以加载数据。我使用您的列表数据(如下)创建了一个示例,其中显示了 2 个最简单的(恕我直言)。阅读所有方法的引用。我不确定你是否可以从字典中加载。我确信只要有足够的 Python 和 NumPy 魔力,这是可能的。

import h5py
import numpy as np

string_names = ['Paul', 'John', 'Anna']
float_heights = [5.9, 5.7, 6.1]
int_ages = [27, 31, 33]
numpy_data = [ np.array([5.4, 6.7, 8.8]),
np.array([3.1, 58.4, 66.4]),
np.array([4.7, 5.1, 4.2]) ]

# Create empty record array with 3 rows
ds_dtype = [('name','S50'), ('height',float), ('ages',int), ('numpy_data', float, (3,) ) ]
ds_arr = np.recarray((3,),dtype=ds_dtype)
# load list data to record array by field name
ds_arr['name'] = np.asarray(string_names)
ds_arr['height'] = np.asarray(float_heights)
ds_arr['ages'] = np.asarray(int_ages)
ds_arr['numpy_data'] = np.asarray(numpy_data)

with h5py.File('SO_59483094.h5', 'w') as h5f:
# load data to dataset my_ds1 using recarray
dset = h5f.create_dataset('my_ds1', data=ds_arr, maxshape=(None) )
# load data to dataset my_ds2 by lists/field names
dset = h5f.create_dataset('my_ds2', dtype=ds_dtype, shape=(100,), maxshape=(None) )
dset['name',0:3] = np.asarray(string_names)
dset['height',0:3] = np.asarray(float_heights)
dset['ages',0:3] = np.asarray(int_ages)
dset['numpy_data',0:3] = np.asarray(numpy_data)

关于python - h5py:如何组织 HDF5 文件以有效读取混合数据类型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59483094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com