Подтвердить что ты не робот

Чтение v 7.3 мат файл в python

Я пытаюсь прочитать файл 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

так может ли кто-нибудь пожелать иметь такую ​​же проблему и может понравиться любому образцу кода

спасибо

4b9b3361

Ответ 1

Попробуйте использовать h5py модуль

import h5py
with h5py.File('test.mat', 'r') as f:
    f.keys()

Ответ 2

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, я подозреваю. Надеюсь, это поможет!

Ответ 3

В Magu_ ответе по связанной теме проверьте пакет hdf5storage, в котором есть удобные функции для чтения файлов matlab mat v7.3; это так же просто, как

import hdf5storage
mat = hdf5storage.loadmat('test.mat')

Ответ 4

Я посмотрел на эту проблему: 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'])

Ответ 5

Согласно кулинарной книге Сципи. http://wiki.scipy.org/Cookbook/Reading_mat_files,

Начиная с выпуска 7.3 Matlab, файлы mat фактически сохраняются в формате HDF5 по умолчанию (кроме случаев, когда вы используете флаг -vX во время сохранения, см. справку save в Matlab). Эти файлы можно прочитать в Python, используя, например, пакет PyTables или h5py. Считывание структур Matlab в файлах mat на данный момент не поддерживается.

Возможно, вы могли бы использовать Octave для повторного сохранения, используя флаг -vX.

Ответ 6

Несмотря на часы поисков, я не нашел, как получить доступ к структурам 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)

Ответ 7

Эта функция читает производимые 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()