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

时间:2019-05-17 10:54:08

标签: python matlab hdf5 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做同样的事情?

2 个答案:

答案 0 :(得分:3)

您的想法正确。 但是,您无需在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)

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

您还应该调查.visititems()。它将递归地访问对象。例如,在这里看看我的答案:
Convert hdf5 to raw organised in folders
它检查访问对象下方的对象数。如果没有子组,则为数据集。当有子组时,它就是一个组。

答案 1 :(得分:0)

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