É possível ler arquivos .mat binários do MATLAB em Python?
Vi que o SciPy alegou suporte à leitura de arquivos .mat, mas não obtive êxito. Instalei o SciPy versão 0.7.0 e não consigo encontrar o loadmat()
método.
É possível ler arquivos .mat binários do MATLAB em Python?
Vi que o SciPy alegou suporte à leitura de arquivos .mat, mas não obtive êxito. Instalei o SciPy versão 0.7.0 e não consigo encontrar o loadmat()
método.
Respostas:
É necessária uma importação, import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
save('myfile.mat','-v7')
Nem funciona scipy.io.savemat
nem scipy.io.loadmat
para matrizes MATLAB versão 7.3. Mas a parte boa é que os arquivos do MATLAB versão 7.3 são conjuntos de dados hdf5. Para que possam ser lidos usando várias ferramentas, incluindo o NumPy .
Para Python, você precisará da h5py
extensão, que requer HDF5 no seu sistema.
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
save
(pelo menos no Matlab R2014b) resulta em um arquivo que não pode ser lido usando a técnica acima. Se você usar o sinalizador '-v7.3', os dados numéricos poderão ser lidos perfeitamente.
save('filename', '-v7.3', 'var1');
Primeiro salve o arquivo .mat como:
save('test.mat', '-v7')
Depois disso, em Python, use a loadmat
função usual :
import scipy.io as sio
test = sio.loadmat('test.mat')
Existe um bom pacote chamado mat4py
que pode ser facilmente instalado usando
pip install mat4py
É fácil de usar (no site):
Carregar dados de um arquivo MAT
A função loadmat
carrega todas as variáveis armazenadas no arquivo MAT em uma estrutura de dados Python simples, usando apenas objetos dict
e Python list
. Matrizes numéricas e de célula são convertidas em listas aninhadas ordenadas por linhas. Matrizes são compactadas para eliminar matrizes com apenas um elemento. A estrutura de dados resultante é composta por tipos simples que são compatíveis com o JSON formato .
Exemplo: Carregue um arquivo MAT em uma estrutura de dados Python:
from mat4py import loadmat
data = loadmat('datafile.mat')
A variável data
é a dict
com as variáveis e os valores contidos no arquivo MAT.
Salvar uma estrutura de dados Python em um arquivo MAT
Dados Python podem ser salvos em um arquivo MAT, com a função savemat
. Dados tem que ser estruturada da mesma forma que para loadmat
, ou seja, deve ser composta de tipos de dados simples, como dict
, list
, str
, int
, efloat
.
Exemplo: Salve uma estrutura de dados Python em um arquivo MAT:
from mat4py import savemat
savemat('datafile.mat', data)
O parâmetro data
deve ser a dict
com as variáveis.
mat4py/cmd.py my.mat
Escritas my.json
, 1 linha longa.)
mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
Tendo o MATLAB 2014b ou mais recente instalado, o mecanismo MATLAB para Python poderia ser usado:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
Existe também o MATLAB Engine for Python do próprio MathWorks. Se você possui o MATLAB, vale a pena considerar isso (não tentei, mas possui muito mais funcionalidade do que apenas ler arquivos do MATLAB). No entanto, não sei se é permitido distribuí-lo a outros usuários (provavelmente não será um problema se essas pessoas tiverem MATLAB. Caso contrário, talvez o NumPy seja o caminho certo a seguir?).
Além disso, se você quiser fazer o básico, o MathWorks fornece (se o link mudar, tente pesquisar no google matfile_format.pdf
ou em seu título MAT-FILE Format
) uma documentação detalhada sobre a estrutura do formato do arquivo. Não é tão complicado quanto eu pensava, mas obviamente, esse não é o caminho mais fácil. Também depende de quantos recursos dos .mat
-files você deseja suportar.
Eu escrevi um script Python "pequeno" (cerca de 700 linhas) que pode ler alguns .mat
arquivos básicos . Não sou especialista em Python nem iniciante e demorei cerca de dois dias para escrevê-lo (usando a documentação do MathWorks vinculada acima). Eu aprendi muitas coisas novas e foi bastante divertido (na maioria das vezes). Como escrevi o script Python no trabalho, receio não poder publicá-lo ... Mas posso dar alguns conselhos aqui:
.mat
arquivo de referência que você deseja analisar.miCOMPRESSED
, miMATRIX
, mxDOUBLE
, ou miINT32
).mat
estrutura -files 'é ideal para salvar os elementos de dados em uma estrutura de dados em árvore; cada nó tem uma classe e subnósfrom os.path import dirname, join as pjoin
import scipy.io as sio
data_dir = pjoin(dirname(sio.__file__), 'matlab', 'tests', 'data')
mat_fname = pjoin(data_dir, 'testdouble_7.4_GLNX86.mat')
mat_contents = sio.loadmat(mat_fname)
Você pode usar o código acima para ler o arquivo .mat salvo padrão no Python.