python - 将嵌套的 .h5 组读入 numpy 数组

标签 python arrays numpy hdf5 h5py

我从 friend 那里收到了这个 .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: 'Group' 对象没有属性 'shape'

我可以看到这些命令不起作用,因为我在 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 是完整路径。

关于python - 将嵌套的 .h5 组读入 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51548551/

相关文章:

python - 减去两个字典的值

javascript - polymer 阵列错误

javascript - 将管道添加到表中

javascript - 两个不同数组的addEventListener - forEach - 代码优化

python - Numpy 与 Python 的 Decimal 参数

python - 在 python 中使用掩码对图像进行有效模糊

python - 使用 Astropy 添加一列以适应文件

python - 如何在spyder中恢复未保存的文件

python - OpenCV python FlannBasedMatcher 添加多个描述符

python - 如何将不同长度的时间窗应用于 Pandas 数据框