python - 来自更大 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()
解决方案
你有正确的想法。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()
推荐阅读
- java - "string" 和 String x = "string" 有什么区别
- vue.js - Vuetify 数据表创建
- docker - 使用 Windows 主机 + Linux vm 的混合 docker swarm 设置
- c# - 如果编辑行返回错误,则更改 GridView 上的页面
- r - Rshiny 如果对象不存在,则忽略下载
- python - 将带有列表的 Pandas DataFrame 写入文件
- hadoop - Hadoop:Mapreduce 未启动/运行
- javascript - 如果引发验证错误,如何在 Rails 中保持模式打开
- java - 如何将 flink 用户自定义指标导出到 prometheus 和 grafana
- chicken-scheme - 为什么这个程序在 Chez Scheme 上有效,但在 Chicken Scheme 上失败了?