首页 > 解决方案 > 来自更大 hdf5 中的组的新 hdf5

问题描述

我以以下形式创建了一个巨大的 hdf5 数据集:

group1/raw
group1/preprocessed
group1/postprocessed
group2/raw
group2/preprocessed
group2/postprocessed
....
group10/raw
group10/preprocessed
group10/postprocessed

但是,我意识到为了便携性,我希望有 10 个不同的 hdf5 文件,每个组一个。python中是否有一个函数可以在不循环所有数据并扫描整个原始hdf5树的情况下实现这一点?

就像是:


import h5py

file_path = 'path/to/data.hdf5'

hf = h5py.File(file_path, 'r')

print(hf.keys())

for group in hf.keys():
    
    # create a new dataset for the group
    hf_tmp = h5py.File(group + '.h5', 'w')
    # get data from hf[key] and dumb them into the new file
    # something like
    # hf_tmp = hf[group]
    # hf_tmp.dumb()
    hf_tmp.close()


hf.close()

标签: pythonhdf5h5py

解决方案


你有正确的想法。SO上有几个问题和答案显示了如何做到这一点。

从这个开始。它显示了如何遍历键并确定它是组还是数据集。:h5py:如何在 HDF5 组和数据集上使用 keys() 循环

然后看看这些。每个都显示了解决问题的略有不同的方法。

这显示了一种方式。将数据集从 1 个 HDF5 文件提取到多个文件

另外,这是我之前写的一篇文章:如何使用 pytables 或 h5py 将数据集对象复制到不同的 hdf5 文件?

这正好相反(将数据集从不同的文件复制到 1 个文件)。它很有用,因为它演示了如何使用该.copy()方法:如何合并多个 .h5 文件?

最后,您应该查看visititems()递归搜索所有组和数据集的方法。看看这个答案的详细信息:有没有办法在 h5py 中一次获取所有组中的数据集?

那应该回答你的问题。

下面是一些将所有这些想法结合在一起的伪代码。它适用于您的架构,其中所有数据集都位于根级别组中。它不适用于具有多个组级别的数据集的更一般情况。用于visititems()更一般的情况。

伪代码如下:

with h5py.File(file_path, 'r') as hf:
    print(hf.keys())  
    # loop on group names at root level
    for group in hf.keys():        
        hf_tmp = h5py.File(group + '.h5', 'w')
        # loop on datasets names in group
        for dset in hf[group].keys():
        # copy dataset to the new group file 
            hf.copy(group+'/'+dset, hf_tmp)  
        hf_tmp.close()

推荐阅读