Ответ 1
Попробуйте использовать h5py
модуль
import h5py
with h5py.File('test.mat', 'r') as f:
f.keys()
Я пытаюсь прочитать файл matlab со следующим кодом
import scipy.io
mat = scipy.io.loadmat('test.mat')
и это дает мне следующую ошибку:
raise NotImplementedError('Please use HDF reader for matlab v7.3 files')
NotImplementedError: Please use HDF reader for matlab v7.3 files
так может ли кто-нибудь пожелать иметь такую же проблему и может понравиться любому образцу кода
спасибо
Попробуйте использовать h5py
модуль
import h5py
with h5py.File('test.mat', 'r') as f:
f.keys()
import h5py
import numpy as np
filepath = '/path/to/data.mat'
arrays = {}
f = h5py.File(filepath)
for k, v in f.items():
arrays[k] = np.array(v)
вы должны получить свои данные в arrays
dict, если у вас нет структур MATLAB, я подозреваю. Надеюсь, это поможет!
В Magu_ ответе по связанной теме проверьте пакет hdf5storage, в котором есть удобные функции для чтения файлов matlab mat v7.3; это так же просто, как
import hdf5storage
mat = hdf5storage.loadmat('test.mat')
Я посмотрел на эту проблему: https://github.com/h5py/h5py/issues/726. Если вы сохранили файл матов с опцией -v7.3
, вы должны сгенерировать список ключей с помощью (в Python 3.x):
import h5py
with h5py.File('test.mat', 'r') as file:
print(list(file.keys()))
Для доступа к переменной a
, например, вы должны использовать тот же трюк:
with h5py.File('test.mat', 'r') as file:
a = list(file['a'])
Согласно кулинарной книге Сципи. http://wiki.scipy.org/Cookbook/Reading_mat_files,
Начиная с выпуска 7.3 Matlab, файлы mat фактически сохраняются в формате HDF5 по умолчанию (кроме случаев, когда вы используете флаг -vX во время сохранения, см. справку save в Matlab). Эти файлы можно прочитать в Python, используя, например, пакет PyTables или h5py. Считывание структур Matlab в файлах mat на данный момент не поддерживается.
Возможно, вы могли бы использовать Octave для повторного сохранения, используя флаг -vX.
Несмотря на часы поисков, я не нашел, как получить доступ к структурам Matlab v7.3. Надеюсь, этот частичный ответ кому-нибудь поможет, и я был бы очень рад увидеть дополнительные указатели.
Итак, начиная с (я думаю, что [0] [0] возникает из-за того, что Matlab дает все измерениям):
f = h5py.File('filename', 'r')
f['varname'][0][0]
дает: & lt; Ссылка на объект HDF5>
Передайте эту ссылку снова f:
f[f['varname'][0][0]]
который дает массив: преобразовать это в пустой массив и извлечь значение (или, рекурсивно, другую & lt; ссылку на объект HDF5>:
np.array(f[f['varname'][0][0]])[0][0]
Если доступ к диску медленный, возможно, загрузка в память поможет.
Дальнейшее редактирование: после долгих тщетных поисков мой последний обходной путь (я действительно надеюсь, что у кого-то еще есть лучшее решение!) Вызывал Matlab из python, что довольно легко и быстро:
eng = matlab.engine.start_matlab() # first fire up a Matlab instance
eng.quit()
eng = matlab.engine.connect_matlab() # or connect to an existing one
eng.sqrt(4.0)
x = 4.0
eng.workspace['y'] = x
a = eng.eval('sqrt(y)')
print(a)
x = eng.eval('parameterised_function_in_Matlab(1, 1)', nargout=1)
a = eng.eval('Structured_variable{1}{2}.object_name') # (nested cell, cell, object)
Эта функция читает производимые Matlab файлы .mat HDF5 и возвращает структуру вложенных кодов массивов Numpy. Matlab записывает матрицы в порядке Фортрана, так что это также переносит матрицы и многомерные массивы в обычный порядок Numpy arr[..., page, row, col]
.
import h5py
def read_matlab(filename):
def conv(path=''):
p = path or '/'
paths[p] = ret = {}
for k, v in f[p].items():
if type(v).__name__ == 'Group':
ret[k] = conv(f'{path}/{k}') # Nested struct
continue
v = v[()] # It a Numpy array now
if v.dtype == 'object':
# HDF5ObjectReferences are converted into a list of actual pointers
ret[k] = [r and paths.get(f[r].name, f[r].name) for r in v.flat]
else:
# Matrices and other numeric arrays
ret[k] = v if v.ndim < 2 else v.swapaxes(-1, -2)
return ret
paths = {}
with h5py.File(filename, 'r') as f:
return conv()