É 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.savematnem scipy.io.loadmatpara 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 h5pyextensã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 loadmatfunção usual :
import scipy.io as sio
test = sio.loadmat('test.mat')
Existe um bom pacote chamado mat4pyque pode ser facilmente instalado usando
pip install mat4py
É fácil de usar (no site):
Carregar dados de um arquivo MAT
A função loadmatcarrega todas as variáveis armazenadas no arquivo MAT em uma estrutura de dados Python simples, usando apenas objetos dicte 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 dictcom 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 datadeve ser a dictcom as variáveis.
mat4py/cmd.py my.matEscritas 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.pdfou 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 .matarquivos 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:
.matarquivo de referência que você deseja analisar.miCOMPRESSED, miMATRIX, mxDOUBLE, ou miINT32).matestrutura -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.