Как сделать массив ссылок на один внешний файл hdf5 с python3? - PullRequest
0 голосов
/ 18 апреля 2020

Мне интересно, возможно ли сделать следующее с файлом hdf5 / cxi:

  • имеет один внешний файл h5, в котором хранится массив numpy с 4-мерным измерением
  • другой файл cxi, в котором рекомендуется добавить группу, которая будет содержать массив внешних ссылок на файл h5

Ожидается, что в cxi появится нечто подобное:

Group1/subgroup  {num, ExternalLink to h5 file}

где num - длина необходимого массива ссылок.

Я пытаюсь сделать:

import h5py as h5
import numpy as np

h5_file = sys.argv[1]
h5path = sys.argv[2]
cxi_file = sys.argv[3]
cxi_path = sys.argv[4]
num = sys.argv[5]

link = h5.ExternalLink(h5_file, h5path)
l = np.array([link] * num)

with h5.File(cxi_file, 'a') as f:
    dset = f.create_dataset(cxi_path, (num,))
    for i in range(num):
        dset[i] = l[i]

Но это не сработало. Я также попытался dset = f.create_dataset(path_to_new_mask,data=l) и составил список этого файла с length = num, но все эти шаги не удалось.

Я буду очень признателен, если кто-то может помочь.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

kitsune_breeze, я просмотрел вопросы и ответы и комментарии. Есть несколько областей, которые необходимо уточнить. Давайте начнем с внешних ссылок против ссылок на объекты или области . Насколько я понимаю, вы хотите создать набор данных (он же массив) из внешних ссылок (каждая ссылка ссылается на отдельный файл HDF5).

В ответе Махсы Хассанкаши 19 апреля описывается как создать набор данных dtype=h5py.ref_dtype или dtype=h5py.regionref_dtype. Первая - это ссылка на объект, а вторая - ссылка на регион. Они не такие, как внешние ссылки! Кроме того, пример кода требует h5py 2.10.0, и вы используете h5py 2.9.0.. (К вашему сведению, в 2.9.0 есть решение этой проблемы, если вы решите использовать ссылки на объекты или регионы.)

Вот плохие новости: на основании моих тестов вы не можете создать набор данных (или np массив) внешних ссылок HDF5. Вот шаги, чтобы понять почему:

In [1]: import h5py
In [2]: h5fw = h5py.File('SO_61290760.h5',mode='w')
# create an external link object
In [3]: link_obj = h5py.ExternalLink('file1.h5','/')
In [4]: type(link_obj)
Out[4]: h5py._hl.group.ExternalLink
In [5]: link_dtype = type(link_obj)
In [6]: h5fw.create_dataset("MyRefs", (10,), dtype=link_dtype)
Traceback (most recent call last):
...
TypeError: Object dtype dtype('O') has no native HDF5 equivalent

Читая документацию h5py, кажется, что ссылки на объекты и регионы также являются dtype('O') типами данных, и для их реализации требуются дополнительные метаданные. Там нет упоминания, что это было сделано для внешних ссылок. В результате я не думаю, что вы можете создать массив внешних ссылок (потому что нет dtype для их поддержки).

Тем не менее, вы все равно можете создавать внешние ссылки из 1 файла HDF5 для несколько файлов HDF5. У меня есть простой пример (см. Метод 1: Создание внешних ссылок).
Как объединить несколько файлов .h5?

Если вы решили использовать ссылки на объекты или области , вам нужно использовать другую спецификацию dtype в h5py 2.9.0.
Ссылка на объект :
2.10.0 use: h5py.ref_dtype
2.9.0 use: h5py.special_dtype(ref=h5py.Reference)
Ссылка на регион :
2.10.0 использование: h5py.regionref_dtype
2.9.0 использование: h5py.special_dtype(ref=h5py.RegionReference)

Код ниже демонстрирует поведение в 2.9.0:

In [9]: type(h5py.ref_dtype)
Traceback (most recent call last):
...
AttributeError: module 'h5py' has no attribute 'ref_dtype'

In [10]: type(h5py.special_dtype(ref=h5py.Reference))
Out[10]: numpy.dtype

In [11]: type(h5py.regionref_dtype)
Traceback (most recent call last):
...   
AttributeError: module 'h5py' has no attribute 'regionref_dtype'

In [12]: type(h5py.special_dtype(ref=h5py.RegionReference))
Out[12]: numpy.dtype

In [13]: dset = h5fw.create_dataset("MyRefs", (10,), dtype=h5py.special_dtype(ref=h5py.Reference))

In [14]: dset.dtype
Out[14]: dtype('O')
0 голосов
/ 18 апреля 2020

Попробуйте

myfile = h5py.File('foo.hdf5','w')

myfile['ext link'] = h5py.ExternalLink("otherfile.hdf5", "/path/to/resource")

dset = f.create_dataset("MyRefs", (100,), dtype=h5py.ref_dtype)

Или:

dset = f.create_dataset("ref", (2,), dtype=h5py.regionref_dtype)
  1. http://docs.h5py.org/en/stable/refs.html#storing набор ссылок в наборе данных
  2. http://docs.h5py.org/en/latest/high/group.html#external -ссылки
...