h5py:如何抽象索引

h5py: How to abstract indices

我有一个 HDF5 文件,其中包含我目前索引的子组:

file = h5py.File(filename, 'r')
data = np.array(file[index1][index2][index3])

我宁愿将这些索引抽象化并传递一个列表 (indices = [index1, index2, index3]),但我想不出比以下更有效的实现方法:

indices = [index1, index2, index3]
file = h5py.File(filename, 'r')
data = file
for i in indices:
     data = data[i]
data = np.array(data)

这行得通,但我希望有一个解决这个问题的方法。

我不完全明白你想做什么。

  • index1, index2, and index3 所有数据集都在根级别(又名 文件组,所以你有 /index1/index2/index3).
  • 或者index1是一个组,index2是一个子组,index3是一个 数据集? (所以路径是/index1/index2/index3?)

如果它们都是数据集,这将循环遍历索引和每次 return 一个数组。

indices = [index1, index2, index3]
file = h5py.File(filename, 'r')
for i in indices:
    arr = file[i][:] # returns a np.array, one per loop

如果索引定义了数据集的路径,则此 returns 1 数组。

indices = [index1, index2, index3]
file = h5py.File(filename, 'r')
path = '/'+'/'.join(indices)
arr = file[path][:] # returns 1 np.array

h5py 没有很好地解释如何索引组和数据集吗?

file 和组是仿照 Python dict,您 select 的下一个级别带有关键字。 file['group1']['group2']['dataset1']。数据集可以像数组一样进行索引,也可以使用 [:].

作为一个整体加载

名称可以串在一起,例如

file['group1/group2/dataset1'][:]

虽然我没有对此进行测试,但我认为没有任何“效率”差异。与 dicts 一样,在加载数据集之前不会加载任何(很多)内容。

顺便说一句,“一个班轮”在任何方面都不是“有效的”(除非你在计算行数:))。