【问题标题】:Is there a way to get datasets in all groups at once in h5py?有没有办法在 h5py 中一次获取所有组中的数据集?
【发布时间】:2020-11-28 13:58:27
【问题描述】:

我有数据存储在 .h5 中。我使用以下代码显示组名,并调用其中一个组 (Event_[0]) 来查看里面的内容:

with h5py.File(data_path, 'r') as f:
    ls = list(f.keys())
    print('List of datasets: \n', ls)
    data = f.get('group_1')
    dataset1 = np.array(data)
    print('Shape of dataset1: \n', dataset1.shape)
    f.close()

它工作正常,但我有 2000 个组,每个组有一个数据集。如何避免为每个组编写相同的代码?有没有办法得到('所有组')?

编辑:再举一个例子:我用

f['Event_[0]'][()]

查看一组。这也可以应用于多个组吗?

【问题讨论】:

  • 你不使用 pandas 有什么原因吗?你能提供一个你的数据和你正在创建的组的例子吗?
  • @Andreas,这与pandas 样式分组无关。这里group 是文件数据层次结构中的一个级别。
  • 啊,我的意思是我不是 h5 专家,但文档指出:“n HDF5 组是一个包含零个或多个 HDF5 对象的结构。一个组有两个部分:一个组标题,其中包含一个组名和一个组属性列表。“如果你通过 pandas 加载它会发生什么?组名没有显示吗?例如作为一列还是什么?
  • @Andreas,我希望就这么简单;不能使用熊猫。该文件包含: 1 个文件夹,其中包含 2000 多个组(键)。我想一起展示里面的东西。但我只为一个小组找到了如何做到这一点。
  • @Andreas,对HDF5 文件使用不同的界面pytables

标签: python h5py


【解决方案1】:

只需迭代键列表:

with h5py.File(data_path, 'r') as f:
    alist = []
    ls = list(f.keys())
    print('List of datasets: \n', ls)
    for key in ls:
         group = f.get(key)
         dataset = group.get(datasetname)[:]
         print('Shape of dataset: \n', dataset.shape)
         alist.append(dataset)
    # don't need f.close() in a with

没有allgroups;有 iter 和 visit 方法,但它们最终会做同样的事情 - 对于文件中的每个组,获取所需的数据集。 h5py 文档应该是完整的,没有隐藏的方法。 visit 是递归的,类似于 Python 操作系统访问目录和文件的功能。

h5py 中,文件和组的行为类似于 Python dicts。该数据集的行为类似于 numpy 数组。

【讨论】:

    【解决方案2】:

    如果您知道您将始终拥有此数据架构,则可以使用键(如上一个答案所示)。这意味着只有根级别的组,而数据集是每个组下的唯一对象。当您不知道文件的确切内容时,“访问者”功能非常方便。

    有 2 个访客功能。它们是visit()visititems()。每个递归遍历对象树,为每个对象调用访问者函数。唯一的区别是 visit 的可调用函数接收 1 个值:name,而对于 visititems,它接收 2 个值:namenode(一个 h5py 对象)。名称就是一个对象的名称,而不是完整的路径名。我更喜欢visititems 有两个原因:1)拥有节点对象允许您对对象类型进行测试(如下所示),以及2)确定路径名需要您知道路径或使用对象的名称属性来获取它。

    下面的示例创建一个简单的 HDF5 文件,创建几个组和数据集,然后关闭该文件。然后它以读取模式重新打开并使用visititems() 遍历文件对象树。 (注意:访问者函数可以有任何名称,并且可以与任何对象一起使用。它从文件结构中的那个点递归遍历。)

    此外,当您使用 with / as: 构造时,您不需要 f.close()

    import h5py
    import numpy as np
    
    def visit_func(name, node) :
        print ('Full object pathname is:', node.name)
        if isinstance(node, h5py.Group) :
            print ('Object:', name, 'is a Group\n')
        elif isinstance(node, h5py.Dataset) :
            print ('Object:', name, 'is a Dataset\n')
        else :
            print ('Object:', name, 'is an unknown type\n')
    
    arr = np.arange(100).reshape(10,10)
    
    with h5py.File('SO_63315196.h5', 'w') as h5w:
        for cnt in range(3):
            grp = h5w.create_group('group_'+str(cnt)) 
            grp.create_dataset('data_'+str(cnt),data=arr) 
        
    with h5py.File('SO_63315196.h5', 'r') as h5r:     
        h5r.visititems(visit_func)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 2019-02-23
      • 2019-09-29
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      相关资源
      最近更新 更多