Этот ответ собран из моих комментариев выше, а также некоторых дополнительных сведений о чтении файлов MATLAB, сохраненных как HDF5. Честно говоря, это сложнее, чем типичный файл HDF5.
Во-первых, давайте рассмотрим вашу ошибку при чтении атрибута mask
. В наборе данных data_dic_save/displacements/roi_ref_formatted
нет атрибута с именем mask
. Вот почему вы получаете ошибку. Вы можете подтвердить:
print (d.attrs.__contains__('mask'))
Фактически, этот набор данных не имеет никаких атрибутов. Следующий код будет перебирать все атрибуты объекта d
, а затем распечатывать имена и значения атрибутов:
for name in d.attrs.__iter__():
print (name, h5f.attrs[name])
Теперь давайте поговорим о файлах MATLAB в формате HDF5. (Предостережение: я не эксперт в MATLAB или ссылках на объекты. Все, что я знаю, я узнал по следам и ошибкам).
Я открыл ваш .mat файл с помощью HDFVIEW из Группа HDF . Я считаю это важным инструментом при запуске с HDF5, поскольку он позволяет вам «увидеть» схему файла и данные в GUI. (Честно говоря, это единственный способ выяснить содержимое файла .mat. Они НЕ описывают себя, как большинство файлов HDF5.) Для справки в конце этого сообщения есть снимок вашего файла.
Все наборы данных в группе displacements
представляют собой массивы ссылок на объекты размером 54X1. То же самое верно для всех наборов данных в группе strains
. Я подозреваю, что наборы данных в группах dispinfo
и straininfo
предоставляют какое-то отображение. Кроме того, я нашел данные region
и size_mask
в наборах данных #refs#/XX
.
Подробную информацию о ссылках на объекты вы должны прочитать в документации h5py. Ссылка: Ссылка на объект h5py do c
Вот краткое объяснение с использованием вашего файла.
Приведенный ниже вызов возвращает d
в виде NumPy массива формы (54,1)
и dtype object
. Оператор печати подтверждает то же самое.
d = f.get('data_dic_save/displacements/roi_ref_formatted')
print (d.dtype, d.shape)
object (54, 1)
Ссылки на объекты указывают на другие объекты в файле. Чтобы увидеть, как это работает, распечатайте первую запись массива в d
, и вы получите ссылку на набор данных Lj
(который будет в группе /#refs#
). Вы можете видеть, что набор данных Lj
представляет собой массив NumPy формы (1,6)
и типа u4
(unsigned int).
print (f[ d[0,0] ])
<HDF5 dataset "Lj": shape (1, 6), type "<u4">
Это означает, что следующие 2 оператора указывают на один и тот же объект и дают тот же результат:
print (f['/#refs#/Lj'][:])
[[3707764736 2 1 1 110 1]]
print (f[ d[0,0] ][:])
[[3707764736 2 1 1 110 1]]
На этом этапе я застрял в интерпретации остальной части ваших данных. Вот несколько дополнительных ответов, которые могут вам помочь.
В этом SO Q&A дается базовое c объяснение чтения файлов .mat: read-matlab-v7-3-file-into- python -list-of- numpy -arrays-via-h5py
Я написал более полное объяснение (для чтения Наборы данных SVHN). Вы можете получить к нему доступ здесь: какая-разница-между-двумя-способами-доступа-hdf5-group-in-svhn
HDFView файла res.mat