python - 将嵌套的 .h5 组读入 numpy 数组
问题描述
我从朋友那里收到了这个 .h5 文件,我需要将其中的数据用于某些工作。所有数据都是数字。这是我第一次使用这类文件。我在这里找到了许多关于阅读这些文件的问题和答案,但我找不到进入文件包含的较低级别的组或文件夹的方法。该文件包含两个主要文件夹,即 X 和 Y X 包含一个名为 0 的文件夹,其中包含两个名为 A 和 B 的文件夹。Y 包含十个名为 1-10 的文件夹。我想读取的数据在 A,B,1,2,..,10 例如我开始
f = h5py.File(filename, 'r')
f.keys()
现在 f 返回[u'X', u'Y']两个主要文件夹
然后我尝试使用 read_direct 读取 X 和 Y 但我得到了错误
AttributeError:“组”对象没有属性“read_direct”
我尝试为 X 和 Y 创建一个对象,如下所示
obj1 = f['X']
obj2 = f['Y']
然后,如果我使用类似的命令
obj1.shape
obj1.dtype
我收到一个错误
AttributeError:“组”对象没有属性“形状”
我可以看到这些命令不起作用,因为我在 X 和 Y 上使用 then,这些文件夹不包含数据,但包含其他文件夹。
所以我的问题是如何进入名为 A、B、1-10 的文件夹来读取数据
即使在文档http://docs.h5py.org/en/latest/quick.html中我也找不到这样做的方法
解决方案
您需要遍历 HDF5 层次结构,直到到达数据集。组没有形状或类型,数据集有。
假设您事先不知道您的层次结构,您可以使用递归算法通过迭代器生成所有可用数据集的完整路径group1/group2/.../dataset
。下面是一个例子。
import h5py
def traverse_datasets(hdf_file):
def h5py_dataset_iterator(g, prefix=''):
for key in g.keys():
item = g[key]
path = f'{prefix}/{key}'
if isinstance(item, h5py.Dataset): # test for dataset
yield (path, item)
elif isinstance(item, h5py.Group): # test for group (go down)
yield from h5py_dataset_iterator(item, path)
for path, _ in h5py_dataset_iterator(hdf_file):
yield path
例如,您可以迭代所有您感兴趣的数据集路径和输出属性:
with h5py.File(filename, 'r') as f:
for dset in traverse_datasets(f):
print('Path:', dset)
print('Shape:', f[dset].shape)
print('Data type:', f[dset].dtype)
请记住,默认情况下,HDF5 中的数组不会完全在内存中读取。您可以通过 读入内存,完整路径arr = f[dset][:]
在哪里。dset
推荐阅读
- mysql - 如何在 MySQL 5.7 中组织这个查询?
- r - 在 ggplot2 中使用 scale_color_manual 时,绘图中的中断和值不匹配
- javascript - Javascript 如果存在则更新数组值,否则将新数组推送到对象
- php - 致命错误:调用未定义函数 random_bytes() 错误
- typescript - 尝试使用 Typescript 条件类型来缩小可以预期的值的可能组合
- node.js - 如何修复 node.js 和 mongoDB 无法返回信息
- c# - 基于构建变量触发 Azure DevOps 版本
- python - 我的 If 语句似乎不起作用
- log4j2 - Websphere Liberty:如何指定 log4j2 配置位置?
- python - 单选按钮导航和值存储