将嵌套的 .h5 组读入 numpy 数组
Posted
技术标签:
【中文标题】将嵌套的 .h5 组读入 numpy 数组【英文标题】:reading nested .h5 group into numpy array 【发布时间】:2019-01-04 00:33:38 【问题描述】:我从朋友那里收到了这个 .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: 'Group' 对象没有属性 '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 中我也找不到这样做的方法
【问题讨论】:
组就像 Python 字典。您必须继续向下索引组,直到到达dataset
。它有一个.shape
,并且能够以numpy
数组的形式下载。 x = f["x']['foo']['bar'][...]
【参考方案1】:
您需要遍历 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
是完整路径。
【讨论】:
非常感谢。我在您回答之前尝试了评论并且有效。 obj1=f["X']['A']。我想知道如何读取包含 10 个子文件夹的第二个文件夹。因为将来会更改为不同的数字。SI 我觉得你的回答很有帮助。我仍然在以下行得到一个无效的语法错误:path = f'prefix/key'。现在,如果我想使用循环而不是使用 10 个不同的命令将数据保存在子文件夹 1-10 中,尤其是如我所说这个数字将来可能会改变 您会收到语法错误,因为 f 字符串仅适用于 Python 3.6+。您可以改用path = '0/1'.format(prefix, key)
。
我在yield from h5py_dataset_iterator(item, path)
中的from
收到一个错误,当我删除它时,代码可以正常工作,但没有在print
命令中打印日期类型或任何这些属性。更重要的是如何读取 Y 组中的十个数据集?更多的循环来读取它们,因为该组中的数据集数量可能不同,并不总是 10 个。抱歉,我想用这个问题打扰你
您使用的是什么版本的 Python? yield from
在 v3.3 中引入。
我的是 2.7.12。与 3.3 相比似乎太旧了以上是关于将嵌套的 .h5 组读入 numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章