Прочитать файл .mat в Python - PullRequest
0 голосов
/ 14 июля 2020

Я знаю, как вызвать Python любые данные из прикрепленного файла (URL), кроме любых данных, связанных с именем «ROI». Например, вы можете проверить "data_dic_save / displacements / roi_ref_formatted". Я хочу использовать данные из этого пути в своей работе (например, маску и регион). Однако я не могу их открыть (прочитать). Не могли бы вы мне помочь?

URL для файла .mat: https://www.dropbox.com/s/127vo3uew0fppw5/res.mat?dl=0

Код:

with h5py.File('~/res.mat', 'r') as f:
    d = f.get('data_dic_save/displacements/roi_ref_formatted')
    print(d.attrs['mask'])

Сообщение об ошибке:

KeyError: "Can't open attribute (can't locate attribute: 'mask')"

1 Ответ

0 голосов
/ 16 июля 2020

Этот ответ собран из моих комментариев выше, а также некоторых дополнительных сведений о чтении файлов 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

...