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


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

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

8 261

8 ответов:

глупая я. Забыл импортировать io...

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

ни 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

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

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

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

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

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

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

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

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

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

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

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

чтение файла

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

Инсектирование типа переменной mat

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

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

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

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

pip install mat4py

он прост в использовании (с веб-сайта):

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

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

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

data = loadmat('datafile.mat')

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

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

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

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

savemat('datafile.mat', data)

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