Фильтровать группы в файле hdf5 с помощью h5py - PullRequest
0 голосов
/ 05 мая 2020

У меня есть проблема, для которой я нашел неэлегантное решение, и хочу знать, есть ли лучший способ сделать это. (Использование python 3.6)

Я хочу сохранить набор результатов экспериментов в разных группах файла .hdf5. Но затем я хочу иметь возможность открывать файл, перебирать все группы и получать наборы данных только из групп определенного типа c.

Неэлегантное решение, которое я нашел, - сохранить информацию, чтобы различать guish группы в имени группы. Например, 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()

Короче говоря, запись отличительной информации в имя группы и последующее разрезание строки - уродливое решение.

Что такое лучший способ сделать это?

Спасибо за чтение.

1 Ответ

1 голос
/ 05 мая 2020

Рассматривали ли вы добавление атрибута в каждую группу?
Тогда вы могли бы фильтровать группы на основе проверки значения атрибута. Нет ограничений на тип данных атрибута. В моем примере используется строка, но это могут быть целые числа или числа с плавающей запятой.

# 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

Я подумал, что добавлю еще один пример с двумя разными значениями атрибута. Он создает 26 групп с именами от group_a до group_z и устанавливает атрибут key на vowel для a/e/i/o/u и consonant для всех остальных букв.

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)
...