arquivos .mat lido em Python
Pergunta
É possível ler MATLAB binário .mat arquivos em Python?
Eu vi que SciPy alegou suporte para leitura de arquivos .mat, mas estou sem sucesso com ele. Eu instalei SciPy versão 0.7.0, e eu não posso encontrar o método loadmat()
.
Solução
Uma importação é necessária, import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
Outras dicas
Nem scipy.io.savemat
, nem trabalho scipy.io.loadmat
para MATLAB matrizes versão 7.3. Mas a parte boa é que a versão MATLAB 7.3 arquivos são conjuntos de dados HDF5. Assim, eles podem ser lidos usando uma série de ferramentas, incluindo NumPy .
Para Python, você terá a extensão h5py
, o que requer HDF5 em 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
Primeiro salve o arquivo .mat como:
save('test.mat', '-v7')
Depois disso, em Python, use a função loadmat
habitual:
import scipy.io as sio
test = sio.loadmat('test.mat')
Há um belo pacote chamado mat4py
que pode ser facilmente instalado usando
pip install mat4py
É simples de usar (a partir do site):
Carregar dados de um arquivo MAT
As cargas função loadmat
todas as variáveis ??armazenadas no arquivo MAT em uma simples estrutura de dados Python, usando apenas dict
e list
objetos do Python. Numérica e matrizes celulares são convertidos em listas aninhadas ordenou-fila. As matrizes são espremidas para eliminar matrizes com um único elemento. A estrutura de dados resultante é composto por tipos simples que são compatíveis com o JSON formato.
Exemplo: Carregar um arquivo MAT em uma estrutura de dados Python:
from mat4py import loadmat
data = loadmat('datafile.mat')
O data
variável é um dict
com as variáveis ??e valores contidos no arquivo MAT.
Salvar uma estrutura de dados Python para um arquivo MAT
dados Python podem ser salvos em um arquivo MAT, com o savemat
função. Dados tem que ser estruturada da mesma forma que para loadmat
, ou seja, ele deve ser composto de tipos de dados simples, como dict
, list
, str
, int
e float
.
Exemplo: Salvar uma estrutura de dados Python para um arquivo MAT:
from mat4py import savemat
savemat('datafile.mat', data)
O data
parâmetro deve ser um dict
com as variáveis.
Tendo 2014b MATLAB ou mais recente instalado, o motor MATLAB para Python poderia ser usado:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
A leitura do arquivo
import scipy.io
mat = scipy.io.loadmat(file_name)
Inspecionando o tipo de variável MAT
print(type(mat))
#OUTPUT - <class 'dict'>
chaves dentro do dicionário são variáveis ??MATLAB e valores são o objetos atribuídos a essas variáveis ??.
Há também a href="http://www.mathworks.de/de/help/matlab/matlab-engine-for-python.html" rel="nofollow noreferrer"> MATLAB Motor por si MathWorks. Se você tem o MATLAB, isso pode valer a pena considerar (eu não tentei me mas tem uma funcionalidade muito mais do que apenas ler arquivos MATLAB). No entanto, eu não sei se é permitido para distribuí-lo a outros usuários (provavelmente não é um problema se as pessoas têm MATLAB. Caso contrário, talvez NumPy é o caminho certo para ir?).
Além disso, se você quer fazer todos os fundamentos mesmo, MathWorks fornece (se o link mudanças, tentar google para matfile_format.pdf
ou seu MAT-FILE Format
título) uma documentação detalhada sobre a estrutura do formato de arquivo. Não é tão complicado como eu pensei pessoalmente, mas, obviamente, esta não é a maneira mais fácil de ir. Ele também depende de quantas características dos .mat
-arquivos que você quer apoio.
Eu escrevi um "pequeno" (cerca de 700 linhas) Python script que pode ler alguns .mat
-arquivos básicos. Não sou nem um especialista em Python nem um novato e ele me levou cerca de dois dias para escrevê-lo (utilizando a documentação MathWorks ligada acima). Eu aprendi um monte de coisas novas e foi bastante divertido (na maioria das vezes). Como já escrevi o script Python no trabalho, eu tenho medo que eu não posso publicá-lo ... Mas posso dar alguns conselhos aqui:
- Em primeiro lugar, leia a documentação.
- Use um editor hexadecimal (como HxD ) e olhar para um
.mat
- referência arquivo que você deseja analisar. - Tente descobrir o significado de cada byte, salvando os bytes em um arquivo .txt e anotar cada linha.
- Use classes para salvar cada elemento de dados (como
miCOMPRESSED
,miMATRIX
,mxDOUBLE
, oumiINT32
) - estrutura de Os
.mat
-arquivos é ideal para guardar os elementos de dados em uma estrutura de dados árvore; cada nó tem uma classe e subnós