Чтение файлов .mat в Python

Можно ли читать двоичные файлы MATLAB.mat в Python?

Я видел, что SciPy якобы поддерживает чтение файлов .mat, но мне это не удается. Я установил SciPy версии 0.7.0 и не могу найти метод loadmat().

Ответ 1

Требуется импорт, import scipy.io...

import scipy.io
mat = scipy.io.loadmat('file.mat')

Ответ 2

Ни scipy.io.savemat, ни scipy.io.loadmat работают для массивов MATLAB версии 7.3. Но хорошо то, что файлы MATLAB версии 7.3 являются наборами данных hdf5. Таким образом, их можно прочитать с помощью ряда инструментов, в том числе NumPy.

Для Python вам понадобится расширение h5py, для которого требуется HDF5 в вашей системе.

import numpy as np
import h5py
f = h5py.File('somefile.mat','r')
data = f.get('data/variable1')
data = np.array(data) # For converting to a NumPy array

Ответ 3

Сначала сохраните файл .mat как:

save('test.mat', '-v7')

После этого в Python используйте обычную функцию loadmat:

import scipy.io as sio
test = sio.loadmat('test.mat')

Ответ 4

Есть хороший пакет под названием mat4py который можно легко установить с помощью

pip install mat4py

Это просто использовать (с сайта):

Загрузить данные из MAT файла

Функция loadmat загружает все переменные, хранящиеся в MAT файле, в простую структуру данных Python, используя только объекты Pythons dict и list. Числовые массивы и массивы ячеек преобразуются в упорядоченные вложенные списки. Массивы сжимаются, чтобы исключить массивы только с одним элементом. Результирующая структура данных состоит из простых типов, которые совместимы с форматом JSON.

Пример: загрузка MAT файла в структуру данных Python:

from mat4py import loadmat

data = loadmat('datafile.mat')

Переменные data являются dict с переменными и значениями, содержащимися в MAT файле.

Сохранить структуру данных Python в MAT файл

Данные Python могут быть сохранены в MAT файл с помощью функции savemat. Данные должны быть структурированы так же, как и для loadmat, т.е. они должны состоять из простых типов данных, таких как dict, list, str, int и float.

Пример: сохранить структуру данных Python в MAT файл:

from mat4py import savemat

savemat('datafile.mat', data)

Параметр data должны быть dict с переменными.

Ответ 5

Установив MATLAB 2014b или новее, движок MATLAB для Python можно использовать:

import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)

Ответ 6

Чтение файла

import scipy.io
mat = scipy.io.loadmat(file_name)

Проверка типа переменной MAT

print(type(mat))
#OUTPUT - <class 'dict'>

Ключи внутри словаря являются переменными MATLAB, а значения являются объектами, назначенными этим переменным.

Ответ 7

Существует также движок MATLAB для Python от самой MathWorks. Если у вас есть MATLAB, об этом стоит подумать (я сам не пробовал, но у него гораздо больше функциональности, чем просто чтение файлов MATLAB). Тем не менее, я не знаю, разрешено ли распространять его среди других пользователей (вероятно, это не проблема, если у этих людей есть MATLAB. В противном случае, возможно, NumPy - правильный путь?).

Кроме того, если вы хотите сделать все основы самостоятельно, MathWorks предоставляет (если ссылка поменяется, попробуйте matfile_format.pdf или его заголовок MAT-file Format) подробную документацию о структуре формата файла. Это не так сложно, как я лично думал, но, очевидно, это не самый простой путь. Это также зависит от того, сколько функций .mat -files вы хотите поддерживать.

Я написал "маленький" (около 700 строк) Python-скрипт, который может читать некоторые базовые .mat -files. Я не эксперт по Python и не новичок, и на его написание у меня ушло около двух дней (с помощью документации MathWorks, ссылки на которую приведены выше). Я узнал много нового, и это было довольно весело (большую часть времени). Поскольку я написал скрипт Python на работе, боюсь, я не смогу его опубликовать... Но я могу дать здесь несколько советов:

  • Сначала прочитайте документацию.
  • Используйте шестнадцатеричный редактор (например, HxD) и найдите ссылку .mat -file, которую вы хотите проанализировать.
  • Попробуйте выяснить значение каждого байта, сохранив байты в файл .txt и аннотируя каждую строку.
  • Используйте классы для сохранения каждого элемента данных (например, miCOMPRESSED, miMATRIX, mxDOUBLE или miINT32)
  • Структура .mat -files 'оптимальна для сохранения элементов данных в древовидной структуре данных; каждый узел имеет один класс и подузлы