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().

Foi útil?

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, ou miINT32)
  • 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top