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

时间:2018-07-26 22:56:32

标签: python arrays numpy hdf5 h5py

我从朋友那里收到了这个.h5文件,我需要使用其中的数据进行某些工作。所有数据均为数值。这是我第一次使用这类文件。我在这里找到了许多有关阅读这些文件的问题和答案,但是我找不到找到较低级别的文件包含的组或文件夹的方法。 该文件包含两个主文件夹,即X和Y X包含一个名为0的文件夹,其中包含两个名为A和B的文件夹。 Y包含十个名为1-10的文件夹。 我要读取的数据在A,B,1,2,..,10中 例如我以

开始
RewriteRule ^favicon\.ico$ http://my-domain.com/favicon.ico [L]

RewriteCond %{HTTP_HOST} ^(.+)\.my-domain\.com$
RewriteRule ^ %1

现在f返回 [u'X',u'Y'] 两个主文件夹

然后我尝试使用read_direct读取X和Y,但出现错误

AttributeError:'Group'对象没有属性'read_direct'

我尝试如下创建X和Y的对象

f = h5py.File(filename, 'r')
f.keys()

然后,如果我使用

这样的命令
obj1 = f['X']

obj2 = f['Y']

我收到错误

AttributeError:“组”对象没有属性“形状”

我可以看到这些命令不起作用,因为我在X和Y上使用了then,这两个文件夹不包含任何数据,但包含其他文件夹。

所以我的问题是如何进入名为A,B,1-10的文件夹以读取数据

即使在文档http://docs.h5py.org/en/latest/quick.html

中,我也找不到解决方法

1 个答案:

答案 0 :(得分:5)

您需要遍历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)

    with h5py.File(hdf_file, 'r') as f:
        for path, _ in h5py_dataset_iterator(f):
            yield path

例如,您可以迭代所有您感兴趣的数据集路径和输出属性:

with h5py.File(filename, 'r') as f:
    for dset in traverse_datasets(filename):
        print('Path:', dset)
        print('Shape:', f[dset].shape)
        print('Data type:', f[dset].dtype)

请记住,默认情况下,HDF5中的阵列不会完全在内存中读取。您可以通过arr = f[dset][:]读入内存,其中dset是完整路径。