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

skr*_*rat 0 python matlab hdf5 h5py

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

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

例:

import h5py
filename = '../Results/someFileName.h5'
data = h5py.File(filename, 'r')
Run Code Online (Sandbox Code Playgroud)

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

for i in range(len(data.keys())):
    group = list(data.keys())[i]
Run Code Online (Sandbox Code Playgroud)

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

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

dset现在哪里是数字数组。

有什么办法可以对h5py做同样的事情吗?

kcw*_*w78 5

您的想法正确。但是,您不需要循环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 = h5f[group][dset] # returns HDF5 dataset object
        print (ds_data)
        print (ds_data.shape, ds_data.dtype)
        arr = h5f[group][dset][:] # adding [:] returns a numpy array
        print (arr.shape, arr.dtype)
        print (arr)
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 使用visititems(-function-)递归循环
    本示例isinstance()用作测试。测试为true时,该对象为Group;测试为true时h5py.Group,为数据集h5py.Dataset。与下面的第二个示例(IMHO)相比,我认为这更像Pythonic。
  2. 将hdf5转换为组织在文件夹中的raw
    它将检查访问的对象下方的对象数。如果没有子组,则为数据集。当有子组时,它就是一个组。