¿Es posible leer archivos binarios MATLAB .mat en Python?
He visto que SciPy presuntamente admite la lectura de archivos .mat, pero no lo he logrado. Instalé SciPy versión 0.7.0, y no puedo encontrar el loadmat()
método.
¿Es posible leer archivos binarios MATLAB .mat en Python?
He visto que SciPy presuntamente admite la lectura de archivos .mat, pero no lo he logrado. Instalé SciPy versión 0.7.0, y no puedo encontrar el loadmat()
método.
Respuestas:
Se requiere una importación, import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
save('myfile.mat','-v7')
Ni scipy.io.savemat
, ni scipy.io.loadmat
funcionan para matrices MATLAB versión 7.3. Pero lo bueno es que los archivos MATLAB versión 7.3 son conjuntos de datos hdf5. Por lo tanto, se pueden leer con una serie de herramientas, incluida NumPy .
Para Python, necesitará la h5py
extensión, que requiere HDF5 en su 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
(al menos en Matlab R2014b) da como resultado un archivo que no se puede leer utilizando la técnica anterior. Si utiliza el indicador '-v7.3', los datos numéricos se pueden leer muy bien.
save('filename', '-v7.3', 'var1');
Primero guarde el archivo .mat como:
save('test.mat', '-v7')
Después de eso, en Python, use la loadmat
función habitual :
import scipy.io as sio
test = sio.loadmat('test.mat')
Hay un buen paquete llamado mat4py
que se puede instalar fácilmente usando
pip install mat4py
Es fácil de usar (desde el sitio web):
Cargar datos de un archivo MAT
La función loadmat
carga todas las variables almacenadas en el archivo MAT en una estructura de datos Python simple, usando solo Python dict
y list
objetos. Las matrices numéricas y de celdas se convierten en listas anidadas ordenadas por filas. Las matrices se comprimen para eliminar las matrices con un solo elemento. La estructura de datos resultante se compone de tipos simples que son compatibles con el formato JSON .
Ejemplo: Cargue un archivo MAT en una estructura de datos de Python:
from mat4py import loadmat
data = loadmat('datafile.mat')
La variable data
es a dict
con las variables y valores contenidos en el archivo MAT.
Guardar una estructura de datos de Python en un archivo MAT
Python de datos se pueden guardar en un archivo MAT, con la función savemat
. De datos tiene que estar estructurado de la misma manera que para loadmat
, es decir, debe estar compuesta de tipos de datos simples, como dict
, list
, str
, int
, yfloat
.
Ejemplo: guardar una estructura de datos de Python en un archivo MAT:
from mat4py import savemat
savemat('datafile.mat', data)
El parámetro data
será a dict
con las variables.
mat4py/cmd.py my.mat
escribe my.json
, 1 línea larga)
mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
Con MATLAB 2014b o una versión más reciente instalada, se podría usar el motor MATLAB para Python :
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
También está el motor MATLAB para Python de MathWorks. Si tiene MATLAB, vale la pena considerarlo (no lo he probado yo mismo, pero tiene mucha más funcionalidad que solo leer archivos de MATLAB). Sin embargo, no sé si está permitido distribuirlo a otros usuarios (probablemente no sea un problema si esas personas tienen MATLAB. De lo contrario, ¿quizás NumPy es el camino correcto?).
Además, si desea hacer todo lo básico usted mismo, MathWorks proporciona (si el enlace cambia, intente buscar en google matfile_format.pdf
o su título MAT-FILE Format
) una documentación detallada sobre la estructura del formato de archivo. No es tan complicado como pensaba personalmente, pero obviamente, esta no es la forma más fácil de hacerlo. También depende de cuántas características del.mat
archivos desee admitir.
He escrito un script Python "pequeño" (aproximadamente 700 líneas) que puede leer algunos .mat
archivos básicos . No soy ni un experto en Python ni un principiante y me llevó cerca de dos días escribirlo (usando la documentación de MathWorks vinculada anteriormente). Aprendí muchas cosas nuevas y fue bastante divertido (la mayoría de las veces). Como he escrito el script de Python en el trabajo, me temo que no puedo publicarlo ... Pero puedo dar algunos consejos aquí:
.mat
archivo de referencia que desee analizar.miCOMPRESSED
, miMATRIX
, mxDOUBLE
, o miINT32
).mat
estructura de los archivos es óptima para guardar los elementos de datos en una estructura de datos de árbol; cada nodo tiene una clase y subnodosfrom 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)
Puede usar el código anterior para leer el archivo .mat guardado predeterminado en Python.