【问题标题】:What is the best data structure to represent arbitrary hierarchical data?表示任意分层数据的最佳数据结构是什么?
【发布时间】:2021-08-21 23:25:55
【问题描述】:

表示/读取具有任意数量子级的分层数据(例如文件夹/文件布局)的最佳数据结构是什么?我见过 N 元树和尝试、k/d 元堆等......但是,您似乎至少需要知道每个节点在这些结构中的最大子节点数量。但是,除了它以某种方式是分层的事实之外,是否有任何类型的结构可以表示任何分层数据而无需对其一无所知?我不太担心优化以表现得这么好,因为我认为我不需要处理大量数据(如果可以优化那就太好了),重要的方面是能够读取一些随机分层数据并维护所述数据的组织。

#example data

root
   - group1
      - subgroup1
         - child
         - child
             - data
      - subgroup2
      - subgroup3
         - child
             - data
   - group2
      - subgroup1
   - group3
      - subgroup1
         - child
             - data
      - subgroup2
         - child
             - data
   - group4
      - subgroup1
      - subgroup2
      - subgroup3
      - subgroup4

同样,格式可以是任意的,可能有 0-500 个组,每个组都有任意数量的嵌套子/路径...

如果需要更多信息,关于上下文:

我希望能够读取任何 h5 文件的布局,而无需专门为 h5 文件编写代码或严格组织具有相同布局的每个 h5 文件。这样我就可以创建一个 GUI,用户可以在其中导航 h5 文件(我正在与不熟悉编程并希望尽可能自动化/拥有 GUI 的科学家合作)。我看过 h5py 和 pandas,但是通过这些库获取密钥并不能以一种易于使用的方式对它们进行排序/返回以表示文件布局(pandas 返回 h5 文件布局的叶节点,h5py 在每个层次结构中读取,而你需要事先知道密钥,因此很难遍历和组织文件布局)。截至目前,我能够使用这些库从 h5 文件中解析键、组和子组等,但我无法维护路径。为此目的使用嵌套元组似乎太复杂和令人困惑,这就是为什么我想知道其他更复杂的数据结构。

另外,我需要在 Python 中执行此操作,因为它是我的同事使用的唯一语言,他们不想学习其他语言(不是出于无知,他们只是不是程序员......)。

【问题讨论】:

  • 使用字典将名称映射到值、同类集合的列表。
  • 分层数据字典
  • 您对 HDF5 有一些误解。该架构被设计为自描述的——您不需要提前知道键(组和数据集名称)。而且,h5py 和 PyTables 都具有递归遍历数据结构以获取所有组和数据集名称的工具。检查 hpy 中的 .visititems() 方法和 PyTables 中的 .walk_nodes() 方法。我更喜欢.walk_nodes(),因为它是对象上的方法。 .visititems() 比较棘手——SO 中也有带有示例的帖子。

标签: python pandas data-structures hdf5 h5py


【解决方案1】:

为了说明自我描述的含义,这里有一个非常简单的示例,它使用.visititems() 递归地访问层次结构中的每个 HDF5 对象。修改以在h5py.File() 调用中引用您的文件,您可以看到输出。您将获得 2 个列表,其中包含可用于填充 GUI 的组和数据集名称。

注意:如果您返回一个值,.visititems() 递归将结束。如果您想在 main() 例程中迭代架构,则需要创建一个生成器并随时生成名称。

def get_h5_grps_dsets(name, h5_obj):
    
    if isinstance(h5_obj,h5py.Group):
        #print(name,'is a Group')
        grp_list.append(name)
    elif isinstance(h5_obj,h5py.Dataset):
        #print(name,'is a Dataset')
        ds_list.append(name)

with h5py.File(file_path, 'r') as h5r:
    
    grp_list = []
    ds_list = []    
    
    h5r.visititems(get_h5_grps_dsets)
    print('\nGroups:')
    for grp in grp_list:
        print(grp)
    print('\nDatasets:')
    for ds in ds_list:
        print(ds)   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2015-11-09
    • 1970-01-01
    • 2017-05-08
    • 2021-12-12
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多