Как изменить размер массива HDF5 с помощью `h5py`

Как изменить размер массива HDF5 с помощью библиотеки h5py Python?

Я пробовал использовать метод .resize и на массиве с chunks, установленным на True. Увы, мне все еще чего-то не хватает.

In [1]: import h5py

In [2]: f = h5py.File('foo.hdf5', 'w')

In [3]: d = f.create_dataset('data', (3, 3), dtype='i8', chunks=True)

In [4]: d.resize((6, 3))
/home/mrocklin/Software/anaconda/lib/python2.7/site-packages/h5py/_hl/dataset.pyc in resize(self, size, axis)
--> 277         self.id.set_extent(size)
ValueError: unable to set extend dataset (Dataset: Unable to initialize object)

In [11]: h5py.__version__ 
Out[11]: '2.2.1'

person MRocklin    schedule 10.04.2014    source источник
comment
Возможно, это как-то связано с типом данных массива ... Может быть, попробовать более стандартный тип данных, такой как тот, который показан в документации для инициализации массива?   -  person anon582847382    schedule 11.04.2014
comment
Просто попробовал без указания dtype (я думаю, что по умолчанию используется float). Та же ошибка   -  person MRocklin    schedule 11.04.2014
comment
Вам не хватает maxshape на create_dataset?   -  person SlightlyCuban    schedule 11.04.2014
comment
@SlightlyCuban, который решает эту проблему. maxshape выделяет столько места на диске? Почему бы не установить его на бесконечность?   -  person MRocklin    schedule 11.04.2014
comment
@MRocklin какую версию h5py вы используете? Я просто попробовал это с помощью 2.2.1, и проблем не было.   -  person SlightlyCuban    schedule 11.04.2014
comment
@SlightlyCuban добавлен в редактирование. 2.2.1   -  person MRocklin    schedule 11.04.2014
comment
@MRocklin не уверен, почему он не работает с вашей стороны. Этот код должен делать то же, что и create_dataset('data', (3, 3), dtype='i8', chunks=True, maxshape=(None, None)). Для записи я на libhdf5 1.8.5   -  person SlightlyCuban    schedule 11.04.2014


Ответы (2)


Как упоминал Орен, вам нужно использовать maxshape при создании dataset, если вы хотите изменить размер массива позже. Установка размера на None позволяет позже изменить размер этого измерения до 2 ** 64 (предел h5):

In [1]: import h5py

In [2]: f = h5py.File('foo.hdf5', 'w')

In [3]: d = f.create_dataset('data', (3, 3), maxshape=(None, 3), dtype='i8', chunks=True)

In [4]: d.resize((6, 3))

In [5]: h5py.__version__
Out[5]: '2.2.1'

Дополнительную информацию см. В документации.

person user130604    schedule 06.10.2014

Вам нужно изменить эту строку:

d = f.create_dataset('data', (3, 3), dtype='i8', chunks=True)

To

d = f.create_dataset('data', (3, 3), maxshape=(?, ?), dtype='i8', chunks=True) 

d.resize((?, ?))

Измените ? на любой размер (вы также можете установить его на Нет)

Прочтите здесь: http://docs.h5py.org/en/latest/high/dataset.html#resizable-datasets

person Oren    schedule 01.05.2014