Ошибка чтения HDF5 с использованием h5py

Я сохранил свой набор данных в этой форме, как указано на следующем изображении (формат HDF5). Итак, у меня есть разные группы, т.е. 4, 2, 40 и т. д., и для каждой группы у меня есть 2 набора данных Annotation и Features. Я успешно сохранил их, используя код, но не могу загрузить их обратно.

Странно, что ошибка возникает только тогда, когда я пытаюсь прочитать Annotation. И чтение работает нормально, когда я пытаюсь прочитать Features.

Я использую следующий код:

dataSet = np.array([])
annotation = np.array([])
hdf5Object = readHDF5File('abc.hdf5','r')
w = 2
myGroup = hdf5Object[str(w)]

dataSet = np.array(myGroup['Features'])
annotation = np.array(myGroup['Annotation'])

Пожалуйста, просветите меня здесь, так как я много борюсь за это некоторое время. Спасибо.

Просмотр HDF5, сгенерированный с помощью ViTables 2.1

ИЗМЕНИТЬ 1

Я получаю следующую ошибку, когда читаю Annotation

Traceback (most recent call last):
  File "xyz.py", line 76, in getAllData
    annotation = np.array(myGroup['Annotation'])
  File "/usr/lib/python2.7/dist-packages/h5py/_hl/group.py", line 153, in __getitem__
    oid = h5o.open(self.id, self._e(name), lapl=self._lapl)
  File "h5o.pyx", line 173, in h5py.h5o.open (h5py/h5o.c:3403)
KeyError: "unable to open object (Symbol table: Can't open object)"

ИЗМЕНИТЬ 2

Итак файл hdf5 формировался в 2 шага, на 1 шаге Features вычислялись следующим образом:

features = <numpy array of thousand rows and 100 columns contains only floating numbers>
w = 2
f = h5py.File('abc.hdf5', 'a')
myGroup = f[str(w)]
myGroup.create_dataset('Features', data=features)

Для разных w файл был добавлен и характеристики рассчитывались в разное время.

Для аннотации используется такая же процедура. Annotation также содержит только числа с плавающей запятой.

ИЗМЕНИТЬ 3

На следующем изображении показано содержимое данных в Annotation и Features одного w. Левое окно Annotation, а правое Features.

введите здесь описание изображения


person Muaz    schedule 04.01.2016    source источник
comment
Можете ли вы предоставить минимальный пример, который создает и загружает такой файл, чтобы люди могли воспроизвести ошибку, не имея доступа к вашим данным? Спасибо.   -  person kazemakase    schedule 04.01.2016
comment
Насколько я знаю, h5py не поддерживает все функции hdf5 — может быть, ваши аннотации используют какие-то более продвинутые функции? Не могли бы вы предоставить пример файла?   -  person David Zwicker    schedule 04.01.2016
comment
Пожалуйста, смотрите отредактированный пост.   -  person Muaz    schedule 04.01.2016
comment
Можете ли вы открыть другие файлы в h5py? Вы пробовали запустить набор тестов (h5py.tests.run_tests())?   -  person ali_m    schedule 04.01.2016
comment
@ali_m да, я могу открыть другой файл с помощью того же кода, он отлично работает.   -  person Muaz    schedule 06.01.2016


Ответы (1)


Я только что понял, что способ, которым я пытался получить доступ к набору данных, использовал string, и каким-то образом при сохранении имени набора данных он был сохранен под unicode или utf-8. Поэтому, когда я конвертирую имя своего набора данных в utf-8, все работает нормально.

Как я выяснил его тип данных

    myGroup = hdf5Object[str(w)]
    childsIter = myGroup.iterkeys()
    for child in childsIter:
        print type(child)

Это дало мне понять, что тип данных моего ключа набора данных - unicode, а не просто строка. Итак, я преобразовал свою строку в юникод следующим образом:

key = unicode('Annotation', "utf-8")
dS = np.array(myGroup[key])

or

myGroup = hdf5Object[str(w)]
childsIter = myGroup.iterkeys()
for child in childsIter:
    dS = np.array(myGroup[child])
person Muaz    schedule 06.01.2016