Чтение структуры данных matlab в массивы numpy

#matlab #numpy-ndarray #hdf5 #h5py

#matlab #numpy-ndarray #hdf5 #h5py

Вопрос:

У меня есть набор MAT-файлов, который содержит matlab struct . Структура имеет множество массивов. Я хотел бы открыть файл и перенести их все в массивы. До сих пор я написал следующий код:

 import h5py
>>> fs = h5py.File('statistics_VAD.mat','r')
>>> list(fs.keys())
['#refs#', 'data']
>>> 
>>> fs['data'].visititems(lambda n,o:print(n, o))
C <HDF5 dataset "C": shape (100, 1), type "|O">
P <HDF5 dataset "P": shape (100, 1), type "|O">
V <HDF5 dataset "V": shape (100, 1), type "|O">
Wn <HDF5 dataset "Wn": shape (100, 1), type "|O">
X <HDF5 dataset "X": shape (100, 1), type "|O">
a <HDF5 dataset "a": shape (100, 1), type "|O">
dn <HDF5 dataset "dn": shape (100, 1), type "|O">
>>> struArray = fs['data']
>>> print(struArray['P'])
<HDF5 dataset "P": shape (100, 1), type "|O">
 

Я не знаю, как перейти HDF5 dataset "P" к numpy массиву. Любое предложение будет оценено по достоинству

Комментарии:

1. Что arr=struArray['P'][:] делает?

2. @hpaulj вывод такой >>> arr=struArray['P'][:] >>> arr array([[<HDF5 object reference>], [<HDF5 object reference>], [<HDF5 object reference>], [<HDF5 object reference>], [<HDF5 object reference>], [<HDF5 object reference>], ... .

3. Эти «ссылки на объекты», вероятно, являются элементами в refs группе, но я не знаю, h5py могу ли я получить их для вас. scipy.io.loadmat может обрабатывать более старый файл style .mat, но даже там результат может иметь «непрозрачные» элементы. Не все, что matlab сохраняет в файл, можно перевести в numpy.

4. @hpaulj поскольку я использовал эту командную строку в matlab для сохранения данных save( 'statistics_VAD.mat','data', '-v7.3'); , я получаю эту ошибку, используя scipy.io.loadmat : mat_contents = sio.loadmat(mat_fname) raise NotImplementedError('Please use HDF reader for matlab v7.3 files') NotImplementedError: Please use HDF reader for matlab v7.3 files

5. Я не рекомендовал вам использовать этот ридер.

Ответ №1:

Приведенный ниже код — пример, упомянутый в моем комментарии (dtd 2021-03-01). Он создает 2 набора данных из массивов NumPy, затем набор данных с 2 ссылками на объекты, по 1 для каждого набора данных. Затем показано, как использовать ссылки на объекты для доступа к данным. Второй набор данных со ссылками на регионы также выполнен для полноты.

Обратите внимание, как h5f[] используется дважды: внутренний получает объект, а внешний получает данные из ссылки на объект. Это тонкость, которая заставляет пользователей привыкать к ссылкам.

 import numpy as np
import h5py

with h5py.File('SO_66410592.h5','w') as h5f :
    # Create 2 datasets using numpy arrays
    arr = np.arange(100).reshape(20,5)
    h5f.create_dataset('array1',data=arr)    
    arr = np.arange(100,0,-1).reshape(20,5)
    h5f.create_dataset('array2',data=arr) 
    
    # Create a dataset of OBJECT references: 
    h5f.create_dataset('O_refs', (10,), dtype=h5py.ref_dtype)
    h5f['O_refs'][0] = h5f['array1'].ref
    print (h5f['O_refs'][0])
    print (h5f[ h5f['O_refs'][0] ])
    print (h5f[ h5f['O_refs'][0] ][0,:])
    h5f['O_refs'][1] = h5f['array2'].ref
    print (h5f['O_refs'][1])
    print (h5f[ h5f['O_refs'][1] ])
    print (h5f[ h5f['O_refs'][1] ][-1,:])

    # Create a dataset of REGION references: 
    h5f.create_dataset('R_refs', (10,), dtype=h5py.regionref_dtype)
    h5f['R_refs'][0] = h5f['array1'].regionref[0,:]
    print (h5f['R_refs'][0])
    print (h5f[ h5f['R_refs'][0] ])    
    print (h5f[ h5f['R_refs'][0] ] [ h5f['R_refs'][0] ]) 
    h5f['R_refs'][1] = h5f['array2'].regionref[-1,:]
    print (h5f['R_refs'][1])
    print (h5f[ h5f['R_refs'][1] ])    
    print (h5f[ h5f['R_refs'][1] ] [ h5f['R_refs'][1] ])