使用 h5py 过滤 hdf5 文件中的组

Filter groups in hdf5 file using h5py

我有一个问题,我找到了一个不雅的解决方案,想知道是否有更好的方法来解决这个问题。 (使用 python 3.6)

我想将一组实验结果存储在 .hdf5 文件的不同组中。但我随后希望能够打开文件,遍历所有组并仅从特定类型的组中获取数据集。

我发现的不优雅的解决方案是在组名中保留区分组的信息。例如 01"ExpA01".

生成文件的代码:

import h5py
import numpy as np


if __name__ == "__main__":
    # name of the file
    FileName = "myFile.hdf5"

    # open the file
    myFile = h5py.File(FileName, 'w')

    # list of groups
    NameList = ["ExpA01", "ExpA02", "ExpB01", "ExpB02"]

    for name in NameList:

        # create new group with the name from the nameList
        myFile.create_group(name)

        # create random data
        dataset = np.random.randint(0, 10, 10)
        # add data set to the group
        myFile[name].create_dataset("x", data=dataset)

    myFile.close()  # close the file

现在我只想读取以 "01" 结尾的组中的数据。为此,我基本上是从群名myFile[k].name.split("/")[-1][-2::] == "01"中读取信息。

读取文件代码:

import h5py
import numpy as np


if __name__ == "__main__":

    FileName = "myFile.hdf5"

    # open the file
    myFile = h5py.File(FileName, 'r')

    for k in myFile.keys():  # loop over all groups
        if (myFile[k].name.split("/")[-1][-2::] == "01"):
            data = np.zeros(myFile[k]["x"].shape)
            myFile[k]["x"].read_direct(data)

            print(data)

myFile.close()

总之,在组名中写入区分信息,然后对字符串进行切片是一种丑陋的解决方案。

执行此操作的更好方法是什么?

感谢阅读。

您是否考虑过为每个组添加一个属性?
然后,您可以根据属性值测试来过滤组。 属性数据类型没有限制。 我的示例使用字符串,但它们可以是整数或浮点数。

# Quick example to create a group attribute, then retrieve:
In [3]: h5f = h5py.File('attr_test.h5','w')
In [4]: grp = h5f.create_group('group1')
In [5]: h5f['group1'].attrs['key']='value'
   ...: 
In [6]: get_value = h5f['group1'].attrs['key']
In [7]: print (get_value)
value

我想我会添加另一个示例,其中包含 2 个不同的属性值。 它创建了 26 个名为 group_agroup_z 的组,并将 key 属性设置为 vowel 用于 a/e/i/o/uconsonant 用于所有其他字母。

vowels = 'aeiouAEIOU'
h5f = h5py.File('attr_test.h5','w')
for ascii in range(97,123):
    grp = h5f.create_group('group_'+chr(ascii))
    if chr(ascii) in vowels: 
        grp.attrs['key']='vowel'
    else :
        grp.attrs['key']='consonant'

for grp in h5f.keys() :
    get_value = h5f[grp].attrs['key']
    print (grp,':',get_value)