2009-05-17 3 views
234

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

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

ответ

339

Дурак я. Забыла импортировать ю ...

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

Официальный учебник по SciPy.io: http://docs.scipy.org/doc/scipy/reference/tutorial/io.html –

+13

scipy не поддерживает матовые файлы v7.3 (см. Примечания [здесь] (http : //docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.io.loadmat.html)). См. [Ответ by vikrantt] (http://stackoverflow.com/a/19340117/674976) для решения. – texnic

+0

Однако вы можете сохранить mat-файлы как более ранние версии. см. http://www.mathworks.com/help/matlab/import_export/mat-file-versions.html (заголовок: «Сохранить в версии MAT-файла Nondefault») – watsonic

92

Ни 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 
+3

Это прекрасно работает, если вы используете флаг «-v7.3» в Matlab при сохранении ваших данных. Использование по умолчанию 'save' (по крайней мере, в Matlab R2014b) приводит к тому, что файл не может быть прочитан с использованием вышеприведенной техники. Если вы используете флаг '-v7.3', числовые данные могут быть прочитаны просто отлично. – chipaudette

+2

Да, это то, что я сказал в своем посте. Вам нужно использовать -v7.3 при сохранении в Matlab. Вы должны сделать это в любом случае, поскольку он использует более качественный/более поддерживаемый/стандартизованный формат. – vikrantt

+2

Не могли бы вы объяснить, какова связь между _f_ и _data_ в вашем примере? Как переместить _f_ в массив numpy? – heracho

4

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

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

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

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

Это какая-то сумасшедшая документация, предоставляемая mathworks. 40 страниц, объясняющих формат, не говоря уже о том, что это подмножество HDF5. – Daniel

+0

Ваш код на github в любом месте? – ErroriSalvo

+1

@ErroriSalvo Nope, извините. Я делал это на работе, а не в свободное время, поэтому я не могу поделиться этим кодом. Также никогда не отполировал его, было более доказательством концепции. – mozzbozz

6

Having Matlab 2014b или новее установлен, Matlab engine for Python может быть использован:

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

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

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

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

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

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

Чтение файла

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

Insecting тип матовой валы BLE

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

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

Смежные вопросы