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

Read multiple datasets from same Group in h5 file using h5py

我的 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 做同样的事情吗?

你的想法是对的。 但是,您不需要循环 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)

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

要避免这些 assumptions/limitations,您应该调查 .visititems() 或编写一个生成器来递归访问对象。前 2 个答案是显示 .visititems() 用法的示例,最后 1 个使用生成器函数:

  1. Use visititems(-function-) to loop recursively
    此示例使用 isinstance() 作为测试。该对象在 h5py.Group 测试为真时是一个组,在 h5py.Dataset 测试为真时是数据集。我认为这比下面的第二个例子(恕我直言)更像 Pythonic。
  2. 它检查访问对象下方的对象数。当没有子组时,它是一个数据集。当有子群时,它就是一个群。
  3. How can I combine multiple .h5 file? 这个问题有多个答案。此答案使用生成器将来自多个文件的数据与多个组和数据集合并到一个文件中。

此方法要求数据集名称'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'][()])