У меня есть набор 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
. Любое предложение будет оценено
arr=struArray['P'][:]
? - person hpaulj   schedule 28.02.2021>>> arr=struArray['P'][:] >>> arr array([[<HDF5 object reference>], [<HDF5 object reference>], [<HDF5 object reference>], [<HDF5 object reference>], [<HDF5 object reference>], [<HDF5 object reference>], ...
. - person Dalek   schedule 28.02.2021refs
, но я не знаю, может лиh5py
получить их для вас.scipy.io.loadmat
может работать с файлом .mat более старого стиля, но даже в этом случае результат может содержать «непрозрачные» элементы. Не все, что Matlab сохраняет в файл, можно перевести в numpy. - person hpaulj   schedule 28.02.2021save( '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
- person Dalek   schedule 28.02.2021loadmat
может обрабатывать файлы, написанные в стиле до версии 7.3, при условии, что они содержат только структуру и ячейки с простыми матричными элементами, хотя результатом может быть сложное наслоение структурированных и объектных массивов dtype. Другие SO исследовали файлы 7.3 с разной степенью успеха. - person hpaulj   schedule 28.02.2021HDF5
один или несколько раз. У меня есть только Octave для экспериментов, и я не знаю, поспевает ли он за изменениями MATLAB в этой области. - person hpaulj   schedule 28.02.2021fs['data']['P']
— это массив ссылок на объекты формы (100,1). Объект можно использовать для ссылки на другой объект в файле или для хранения вложенного массива — массива массивов. Что вы получите, еслиprint (struArray['P'][1,1])
? Знание этого может помочь вывести схему. - person kcw78   schedule 01.03.2021ValueError: Index (1) out of range (0-0)
, но с помощью этой команды я получил>>> print (struArray['P'][1]) [<HDF5 object reference>]
. - person Dalek   schedule 01.03.2021[0,0]
, чтобы получить первый элемент. Форма (100,1) - person hpaulj   schedule 01.03.2021>>> print (struArray['P'][0,0]) <HDF5 object reference>
. - person Dalek   schedule 01.03.2021struArray['P'][0,0]
объект, на который ссылаются,fs [ struArray['P'][0,0] ]
. Чтобы продемонстрировать поведение, я собрал небольшой пример и опубликовал его в качестве ответа. (Это не точный ответ, но он показывает процесс, используемый для получения объектов, а затем чтения разыменованных данных. Я также добавил код для ссылки на регион (для полноты). - person kcw78   schedule 01.03.2021