Чтение файлов .mat на Python
Вопрос
Можно ли читать двоичные файлы MATLAB .mat на Python?
Я видел, что SciPy якобы поддерживает чтение файлов .mat, но мне это не удалось.Я установил SciPy версии 0.7.0, и я не могу найти loadmat()
способ.
Решение
Требуется импорт, import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
Другие советы
Ни то , ни другое 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
Сначала сохраните файл .mat как:
save('test.mat', '-v7')
После этого в Python используйте обычный loadmat
функция:
import scipy.io as sio
test = sio.loadmat('test.mat')
Есть хороший пакет под названием 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
с переменными.
При установке MATLAB 2014b или новее Движок MATLAB для Python может быть использован:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
Чтение файла
import scipy.io
mat = scipy.io.loadmat(file_name)
Проверка типа переменной MAT
print(type(mat))
#OUTPUT - <class 'dict'>
В ключи внутри словаря находятся Переменные MATLAB, и в ценности являются ли объекты , присвоенные этим переменным.
Существует также Движок MATLAB для Python самим MathWorks.Если у вас есть MATLAB, возможно, это стоит рассмотреть (я сам его не пробовал, но он обладает гораздо большей функциональностью, чем просто чтение файлов MATLAB).Однако я не знаю, разрешено ли распространять его среди других пользователей (вероятно, это не проблема, если у этих людей есть MATLAB.В противном случае, может быть, NumPy - это правильный путь?).
Кроме того, если вы хотите сделать все основы самостоятельно, MathWorks обеспечивает (если ссылка изменится, попробуйте поискать в Google matfile_format.pdf
или его название MAT-FILE Format
) подробная документация по структуре формата файла.Это не так сложно, как я лично думал, но очевидно, что это не самый простой путь.Это также зависит от того, сколько функций .mat
-файлы, которые вы хотите поддерживать.
Я написал "небольшой" (около 700 строк) Скрипт на Python, который может читать некоторые базовые .mat
-файлы.Я не эксперт по Python и не новичок, и мне потребовалось около двух дней, чтобы написать его (используя документацию MathWorks, связанную выше).Я узнал много нового, и это было довольно весело (большую часть времени).Поскольку я написал скрипт на Python на работе, боюсь, я не смогу его опубликовать...Но здесь я могу дать несколько советов:
- Сначала прочтите документацию.
- Используйте шестнадцатеричный редактор (например, ВхД) и загляните в справочную
.mat
-файл, который вы хотите проанализировать. - Попытайтесь выяснить значение каждого байта, сохранив байты в текстовый файл и снабдив каждую строку комментариями.
- Используйте классы для сохранения каждого элемента данных (например,
miCOMPRESSED
,miMATRIX
,mxDOUBLE
, илиmiINT32
) - В
.mat
-структура файлов оптимальна для сохранения элементов данных в виде древовидной структуры данных;каждый узел имеет один класс и подузлы