Читать файлы .mat в Python - PullRequest
313 голосов
/ 17 мая 2009

У кого-нибудь есть успешный опыт чтения двоичных файлов Matlab .mat в Python?

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

Ответы [ 7 ]

428 голосов
/ 17 мая 2009

Глупый я. Забыл импортировать IO ...

import scipy.io
mat = scipy.io.loadmat('file.mat')
131 голосов
/ 13 октября 2013

Ни scipy.io.savemat, ни scipy.io.loadmat не работают для массивов matlab - v7.3. Но хорошо то, что файлы matlab --v7.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 numpy array
22 голосов
/ 16 июня 2015

Я прикрутил полчаса даже после прочтения ответов. Надеюсь, этот ответ поможет

Сначала сохраните файл мата как

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

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

import scipy.io as sio
test = sio.loadmat('test.mat')
11 голосов
/ 23 сентября 2018

Существует замечательный пакет mat4py, который можно легко установить с помощью

pip install mat4py

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

Загрузка данных из MAT-файла

Функция loadmat загружает все переменные, хранящиеся в файле MAT, в простую структуру данных Python, используя только объекты Python 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 с переменными.

11 голосов
/ 07 марта 2015

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

import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat",nargout=1)
9 голосов
/ 05 марта 2018

Чтение файла

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

Пересечение типа переменной мата

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

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

5 голосов
/ 10 октября 2014

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

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

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

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