Вопрос

Можно ли читать двоичные файлы 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-структура файлов оптимальна для сохранения элементов данных в виде древовидной структуры данных;каждый узел имеет один класс и подузлы
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top