Как получить доступ к переменным ячейки, хранящимся в файле .mat, с помощью модуля h5py? - PullRequest
0 голосов
/ 09 января 2020

У меня есть несколько переменных MATLAB следующих полей данных, которые я сохранил в файле test.mat, используя флаг -v7.3, и хочу выполнить обратное чтение, используя модуль h5py для других целей.

load('test.mat'); % give me this 

struct with fields:
       volume: [4240×1 double]
     centroid: [4240×3 double]
        faces: {4240×1 cell}
          nuc: {4240×1 cell}

Я могу прочитать переменную двойного поля, но не могу получить доступ к переменной поля ячейки. Есть ли какой-либо способ, которым я могу получить доступ к nu c и переменная лиц от python?

>>>import h5py
>>>name='test.mat' 
>>>f=h5py.File(name)
>>>f.keys()
<KeysViewHDF5 ['#refs#', 'volume', 'centroid', 'faces', 'nuc']>
>>>o1=f['centroid'] 
<HDF5 dataset "centroid": shape (3, 4240), type "<f8">
>>>o1[:,0]
array([ -387.82973928,   533.54789111, -7359.64917621])
>>>o3=f['nuc']
<HDF5 dataset "nuc": shape (1, 4240), type "|O">
>>>type(o3)
<class 'h5py._hl.dataset.Dataset'>
>>>type(o3[0])
<class 'numpy.ndarray'>
>>>type(o3[0][0])
<class 'h5py.h5r.Reference'>
>>>o3[0][0]
<HDF5 object reference>
>>>o3[0]
array([<HDF5 object reference>, <HDF5 object reference>,
   <HDF5 object reference>, ..., <HDF5 object reference>,
   <HDF5 object reference>, <HDF5 object reference>], dtype=object)

Я испробовал все опции, но не вижу числовые значения переменной nu c. Любое предложение будет оценено.

Спасибо за комментарий всем. Следующая команда работает сейчас.

 >>> f[f['nuc'][0][0]][:]
   array([[ -733.94435313,  -733.66995189,  -734.09632262, ...,
     -733.66832197,  -733.81233202,  -733.54615564],
   [  247.76823184,   247.49908481,   248.17514583, ...,
      240.16088783,   240.56909865,   240.84810507],
   [-7485.86866961, -7485.92114207, -7485.93468626, ...,
    -7508.16909395, -7508.16306386, -7508.20712349]])
 >>> f[f['nuc'][0][0]][:].shape
    (3, 1512)
 >>> f[f['nuc'][0][1]][:].shape
    (3, 1491)
 >>> f[f['nuc'][0][2]][:].shape
    (3, 1556)

1 Ответ

2 голосов
/ 09 января 2020
Файл

.mat, сохраненный с использованием флага -v7.3 (формат HDF5), использует сложную схему данных, которая использует «ссылки на объекты». Ссылки на объекты - это не данные, а указатель на данные (в другом месте). Вы используете ссылку на объект для получения данных (в вашем примере значения nu c). Вы можете получить данные для первого элемента nuc следующим образом:
arr = f[ f['nuc'][0][0] ][:] или arr = f[ o3[0][0] ][:]
(Вы также можете использовать запятые, если предпочитаете: f[ f['nuc'][0,0] ][:])

Деконструкция выражения выше:
f['nuc'] -> это поле (столбец) данных
f['nuc'][0] -> это первый элемент в столбце (массив ссылок на объекты)
f['nuc'][0][0] -> является первой ссылкой на объект в массиве
f[ f['nuc'][0][0] ][:] -> разыменовывает ссылку на объект и читает данные, ie читает массив
В качестве альтернативы, вы можете сделать это (метод, который я предпочитаю для читаемость):
obj_ref = f['nuc'][0][0] -> возвращает первую ссылку на объект
f[obj_ref][:] -> разыменовывает ссылку на объект и считывает данные массива

Эти вопросы и ответы по SO дают основание c объяснение чтения .mat файлов:
read-matlab-v7-3-file-into- python -list-of- numpy -arrays-via-h5py

Я написал более полное объяснение (для чтения наборов данных SVHN). Вы можете получить к нему доступ здесь:
что такое разница между двумя способами доступа к hdf5-group-in-svhn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...