使用 h5py 从 h5 文件中的同一组中读取多个数据集

Posted

技术标签:

【中文标题】使用 h5py 从 h5 文件中的同一组中读取多个数据集【英文标题】:Read multiple datasets from same Group in h5 file using h5py 【发布时间】:2019-10-04 16:50:26 【问题描述】:

我的 h5 文件中有几个组:'group1', 'group2', ...,每个组有 3 个不同的数据集:'dataset1', 'dataset2', 'dataset3',它们都是具有数值的数组,但数组的大小不同。

我的目标是将每个数据集从组保存到一个 numpy 数组。

示例:

import h5py
filename = '../Results/someFileName.h5'
data = h5py.File(filename, 'r')

现在我可以轻松地遍历所有组

for i in range(len(data.keys())):
    group = list(data.keys())[i]

但我不知道如何访问组内的数据集。所以我正在寻找类似 MATLAB 的东西:

hinfo = h5info(filename);
for i = 1:length(hinfo.Groups())
     datasetname = [hinfo.Groups(i).Name '/dataset1'];
     dset = h5read(fn, datasetname);

dset 现在是一个数字数组。

有没有办法可以用 h5py 做同样的事情?

【问题讨论】:

【参考方案1】:

你的想法是对的。 但是,您不需要在range(len(data.keys())) 上循环。 只需使用data.keys();它返回一个可迭代的对象名称列表。 试试这个:

import h5py
filename = '../Results/someFileName.h5'
data = h5py.File(filename, 'r')
for group in data.keys() :
    print (group)
    for dset in data[group].keys():      
        print (dset)
        ds_data = data[group][dset] # returns HDF5 dataset object
        print (ds_data)
        print (ds_data.shape, ds_data.dtype)
        arr = data[group][dset][:] # adding [:] returns a numpy array
        print (arr.shape, arr.dtype)
        print (arr)

注意:仅当顶层只有组(无数据集)时,上述逻辑才有效。它不会将对象类型作为组或数据集进行测试。

为避免这些假设/限制,您应该调查.visititems()。它将递归地访问对象。查看这 2 个答案以获取显示 .visititems() 用法的示例:

    [使用 visititems(-function-) 递归循环][1] 此示例使用isinstance() 作为测试。该对象在测试h5py.Group 为真时是一个组,而在测试h5py.Dataset 为真时是一个数据集。我认为这比下面的第二个示例更 Pythonic(恕我直言)。 [将 hdf5 转换为按文件夹组织的原始文件][2] 它检查访问对象下方的对象数量。当没有子组时,它是一个数据集。当有子组时,它就是一个组。

[1]:https://***.com/a/57067674/10462884) [2]:Convert hdf5 to raw organised in folders

编辑

【讨论】:

@skrat,我修改了我的原始帖子以修复检索数据时的一个小(但很重要)错误。当你使用arr = h5f[group][dset] 时,你会得到一个HDF5 数据集对象(不是一个numpy 数组)。在许多方面,对象的行为就像一个数组(您可以切片等)。但是,并非所有 numpy 数组方法都适用于数据集对象(.reshape() 就是一个示例)。如果您需要一个 numpy 数组,请使用 numpy 索引表示法添加一个范围([:] 用于我的代码中的整个数据集)。您可以切片以将数据子集作为数组获取。注意:支持有限的花式索引子集。阅读 h5py 文档了解详情。【参考方案2】:

此方法要求数据集名称“dataset1”、“dataset2”、“dataset3”等在一个 hdf5 文件的每个 hdf5 组中相同。

# create empty lists
lat = []
lon = []
x = []
y = []

# fill lists creating numpy arrays
h5f = h5py.File('filename.h5', 'r') # read file
for group in h5f.keys(): # iterate through groups
    for datasets in h5f[group].keys(): #iterate through datasets
        lat = np.append(lat, h5f[group]['lat'][()]) # append data
        lon = np.append(lon, h5f[group]['lon'][()])
        x = np.append(x, h5f[group]['x'][()])
        y = np.append(y, h5f[group]['y'][()])

【讨论】:

以上是关于使用 h5py 从 h5 文件中的同一组中读取多个数据集的主要内容,如果未能解决你的问题,请参考以下文章

h5py 可以从内存中的字节数组加载文件吗?

使用 h5py 读取 matlab .mat 文件

如何使用 Python 和 h5py 读取 HDF5 属性(元数据)

如何使用 h5py 从 HDF5 数据集中读取字符串

是否可以使用 python 3 对 h5py 中的键进行切片而不形成列表?

Pandas 无法读取使用 h5py 创建的 hdf5 文件