Читать файлы .mat в Python

253

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

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

Теги:
file-io
scipy
mat-file

7 ответов

338
Лучший ответ

Глупый мне. Забыл импортировать io...

import scipy.io
mat = scipy.io.loadmat('file.mat')
Показать ещё 2 комментария
101

Ни один 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
  • 4
    Это прекрасно работает, если вы используете флаг '-v7.3' в Matlab при сохранении ваших данных. Использование save по умолчанию (по крайней мере в Matlab R2014b) приводит к файлу, который не может быть прочитан с использованием описанной выше техники. Если вы используете флаг '-v7.3', числовые данные могут быть прочитаны очень хорошо.
  • 2
    Да, это то, что я сказал в своем посте. Вам нужно использовать -v7.3 при сохранении в Matlab. Вы должны сделать это в любом случае, поскольку он использует лучший / более поддерживаемый / стандартизированный формат.
Показать ещё 2 комментария
18

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

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

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

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

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

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

import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat",nargout=1)
  • 0
    Я получил эту ошибку: ModuleNotFoundError: Нет модуля с именем 'pylab'.
  • 1
    Вы получили ошибку при попытке ответить на этот вопрос? Это странно, он не использует pylab.
5

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

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

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

  • Сначала прочтите документацию
  • Используйте HEX-редактор (например, HxD) и посмотрите в ссылочный .mat файл, который хотите разобрать
  • Попытайтесь выяснить значение каждого байта, сохранив байты в txt файле и отметьте каждую строку
  • Используйте классы для сохранения каждого элемента данных (например, miCOMPRESSED, miMATRIX, mxDOUBLE или miINT32)
  • Структура .mat -files является оптимальной для сохранения элементов данных в структуре данных дерева; каждый node имеет один класс и подносы
  • 7
    Это какая-то сумасшедшая документация, предоставленная mathworks. 40 страниц, объясняющих формат, не говоря уже о том, что это подмножество HDF5.
  • 0
    ваш код на github где-нибудь?
Показать ещё 1 комментарий
3

Чтение файла

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

Население типа переменной матрицы

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

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

2
Файлы

hdf5 также могут обрабатываться с помощью PyTables. Их FAQ содержит запись, которая сравнивается с h5py: https://pytables.github.io/FAQ.html. PyTables также поставляется с удобным визуализатором ViTables: http://vitables.org/galleries/Screenshots/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню