h5py hdf5 извлечь атрибут из членов группы в список - PullRequest
0 голосов
/ 01 ноября 2018

Проблема: Я хочу извлечь атрибут каждого члена группы файлов hdf5 в список (на самом деле не совсем так, как вы увидите, но это не имеет отношения к проблеме, поэтому я делаю это просто).

Я думал, что функция посещения является наиболее эффективным способом для этого. Я могу распечатать результаты, но мне не удается добавить результаты в список.

Эта функция вызывается при посещении:

def func(name,obj):

   attribute = obj.attr.get('attribute_group')
   if attribute == 2:
       result = name
       print(result)

Это функция посещения, которая применяет функцию func ко всем членам группы.

file = h5py.File(filepath,'r')
obj = file['/channel_groups/0/clusters/main/']
obj.visit(func)

Пока все хорошо. Но как сохранить результат, считываемый на каждой итерации?

Решения, которые не работают:

  1. добавление return result в конец функции останавливает функцию после возврата первого результата - как указано в документации.

  2. Включение приложения в список в «посещение» приводит к ошибке.

    results = [] obj.visit(results.append(func(obj,results)) TypeError: 'NoneType' object is not callable

  3. подача списка в функцию и добавление его в него также не работает:

    results = [] obj.visit(func(results)) TypeError: func() missing 1 required positional argument: 'obj'

Или obj.visit(func(obj,results)) TypeError: 'NoneType' object is not callable

Разве это не возможно? Я хочу избежать вызова каждого члена в цикле, потому что это занимает время.

Заранее спасибо

1 Ответ

0 голосов
/ 01 ноября 2018

Как зациклить группы HDF5 в Python, удаляя строки в соответствии с маской?

правильно ли добавляется список (есть и другие примеры [h5py] visit).

Аргумент для visit должен быть вызван, то есть функция:

results = []
obj.visit(results.append(func(obj,results))
TypeError: 'NoneType' object is not callable

results.append(....) - это полный вызов функции, который python выполняет еще до вызова visit. Результат этого добавления к списку None (добавление на месте). Так эффективно вы просто делаете

results=[]
results.append(func(obj, results))
obj.visit(None)

Я думаю, тебе нужно что-то вроде

def func(name,obj):
   attribute = obj.attr.get('attribute_group')
   if attribute == 2:
       result = name
       print(result)
       results.append(result)
obj.visit(func)

Помните, что аргумент, который вы указываете visit, должен быть оцененной функцией, а не результатом вызова какой-либо функции. Это должно быть callable.


Я создал файл с одной группой и двумя наборами данных

In [24]: results = []
In [25]: f.visit(results.append)
In [26]: results
Out[26]: ['agroup', 'agroup/bar', 'agroup/foo']

Просмотр имени и объекта ссылки:

In [27]: def func(name):
    ...:     print(name, f[name])
    ...:     
In [28]: f.visit(func)
agroup <HDF5 group "/agroup" (2 members)>
agroup/bar <HDF5 dataset "bar": shape (6,), type "<i8">
agroup/foo <HDF5 dataset "foo": shape (3,), type "<i8">

или с более сложной функцией:

def func(name):
    obj = f[name]
    attr = list(obj.attrs.items())
    print(name, obj, attr)
    x = obj.attrs.get('x',None)
    if x:     # not none
        results.append((name, x))
In [35]: results=[]
In [36]: f.visit(func)
agroup <HDF5 group "/agroup" (2 members)> []
agroup/bar <HDF5 dataset "bar": shape (6,), type "<i8"> [('x', 10)]
agroup/foo <HDF5 dataset "foo": shape (3,), type "<i8"> [('x', 1)]
In [37]: results
Out[37]: [('agroup/bar', 10), ('agroup/foo', 1)]

Снова глядя на групповые документы, я вижу, что есть метод visititems:

def func(name, obj):
    attr = list(obj.attrs.items())
    print(name, obj, attr)
    x = obj.attrs.get('x',None)
    if x:     # not none
        results.append((name, x))

In [45]: results=[]
In [46]: f.visititems(func)
agroup <HDF5 group "/agroup" (2 members)> []
agroup/bar <HDF5 dataset "bar": shape (6,), type "<i8"> [('x', 10)]
agroup/foo <HDF5 dataset "foo": shape (3,), type "<i8"> [('x', 1)]
In [47]: results
Out[47]: [('agroup/bar', 10), ('agroup/foo', 1)]
...