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

标签 python numpy hdf5 h5py

我目前正在使用 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/

相关文章:

python - 使用 HTML 调用 python 函数

python - 有没有更有效的方法来枚举 python 或 R 中离散随机变量的每个可能结果的概率?

python - 如何根据字典键定义变量名?

python - 将大型 Python 数组保存到磁盘以备后用---hdf5?其他一些方法?

python - 使用 data_columns 查询 HDF 中的多索引表时出现问题

hdf5 - 将几个 hdf5 文件合并到一个 pytable 中

python - 当方法返回时字典缺少键

python - 如何在OpenCV中从此阈值图像中消除噪点?

python - Numpy 二维数组 : change all values to the right of NaNs

python - Google App Engine 上的 mlpy、numpy、scipy