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

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

Рекомендованный метод *1004* для рекурсивного посещения всех групп - visit(callable), но я не могу работатьКак передать мою маску вызываемой.

Вот код, который, я надеюсь, демонстрирует, что я хотел бы сделать, но который не работает:

def apply_mask(name, *args):
    h5obj[name] = h5obj[name][mask]

with h5py.File(os.path.join(directory, filename), 'r+') as h5obj:
    h5obj.visit(apply_mask, mask)

Что приводит к ошибке

TypeError: visit() takes 2 positional arguments but 3 were given

Как мне получить массив масок в эту функцию?

1 Ответ

0 голосов
/ 27 апреля 2018

Я в конце концов достиг этого с помощью серии хакерских обходных путей. Если есть лучшее решение, мне было бы интересно узнать об этом!

with h5py.File(os.path.join(directory, filename), 'r+') as h5obj:
    # Use the visit callable to append to a list of key names
    h5_keys = []
    h5obj.visit(h5_keys.append)
    # Then loop over those keys and, if they're datasets rather than
    # groups, remove the invalid rows
    for h5_key in h5_keys:
        if isinstance(h5obj[h5_key], h5py.Dataset):
            tmp = np.array(h5obj[h5_key])[mask]
            # There is no way to simply change the dataset because its
            # shape is fixed, causing a broadcast error, so it is
            # necessary to delete and then recreate it.
            del h5obj[h5_key]
            h5obj.create_dataset(h5_key, data=tmp)
...