#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] ])