Est-il possible de lire des fichiers binaires MATLAB .mat en Python?
J'ai vu que SciPy a prétendument pris en charge la lecture des fichiers .mat, mais je n'y parviens pas. J'ai installé SciPy version 0.7.0 et je ne trouve pas la loadmat()méthode.
Est-il possible de lire des fichiers binaires MATLAB .mat en Python?
J'ai vu que SciPy a prétendument pris en charge la lecture des fichiers .mat, mais je n'y parviens pas. J'ai installé SciPy version 0.7.0 et je ne trouve pas la loadmat()méthode.
Réponses:
Une importation est requise, import scipy.io...
import scipy.io
mat = scipy.io.loadmat('file.mat')
save('myfile.mat','-v7')
Ni scipy.io.savemat, ni ne scipy.io.loadmatfonctionne pour les baies MATLAB version 7.3. Mais la bonne partie est que les fichiers MATLAB version 7.3 sont des ensembles de données hdf5. Ils peuvent donc être lus à l'aide d'un certain nombre d'outils, y compris NumPy .
Pour Python, vous aurez besoin de l' h5pyextension, qui nécessite HDF5 sur votre système.
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(au moins dans Matlab R2014b) entraîne un fichier qui ne peut pas être lu à l'aide de la technique ci-dessus. Si vous utilisez le drapeau '-v7.3', les données numériques peuvent être lues très bien.
save('filename', '-v7.3', 'var1');
Enregistrez d'abord le fichier .mat sous:
save('test.mat', '-v7')
Après cela, en Python, utilisez la loadmatfonction habituelle :
import scipy.io as sio
test = sio.loadmat('test.mat')
Il y a un joli paquet appelé mat4pyqui peut facilement être installé en utilisant
pip install mat4py
Il est simple à utiliser (à partir du site Web):
Charger des données à partir d'un fichier MAT
La fonction loadmatcharge toutes les variables stockées dans le fichier MAT dans une structure de données Python simple, en utilisant uniquement des objets dictet Python list. Les tableaux numériques et cellulaires sont convertis en listes imbriquées rangées. Les tableaux sont compressés pour éliminer les tableaux avec un seul élément. La structure de données résultante est composée de types simples compatibles avec le JSON format .
Exemple: chargez un fichier MAT dans une structure de données Python:
from mat4py import loadmat
data = loadmat('datafile.mat')
La variable dataest un dictavec les variables et les valeurs contenues dans le fichier MAT.
Enregistrer une structure de données Python dans un fichier MAT
Les données Python peuvent être enregistrées dans un fichier MAT, avec la fonction savemat. Les données doivent être structurées de la même manière que pour loadmat, à savoir qu'il devrait être composé de types de données simples, comme dict, list, str, intetfloat .
Exemple: enregistrez une structure de données Python dans un fichier MAT:
from mat4py import savemat
savemat('datafile.mat', data)
Le paramètre datadoit être a dictavec les variables.
mat4py/cmd.py my.matécrit my.json, 1 longue file.)
mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
Après avoir installé MATLAB 2014b ou une version plus récente, le moteur MATLAB pour Python pourrait être utilisé:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
Il existe également le moteur MATLAB pour Python de MathWorks lui-même. Si vous avez MATLAB, cela pourrait valoir la peine d'être considéré (je ne l'ai pas essayé moi-même mais il a beaucoup plus de fonctionnalités que la simple lecture de fichiers MATLAB). Cependant, je ne sais pas s'il est autorisé à le distribuer à d'autres utilisateurs (ce n'est probablement pas un problème si ces personnes ont MATLAB. Sinon, NumPy est peut-être la bonne voie à suivre?).
De plus, si vous voulez faire vous-même toutes les bases, MathWorks fournit (si le lien change, essayez de rechercher Google matfile_format.pdfou son titre MAT-FILE Format) une documentation détaillée sur la structure du format de fichier. Ce n'est pas aussi compliqué que je le pensais personnellement, mais évidemment, ce n'est pas la voie la plus simple à suivre. Cela dépend également du nombre de fonctionnalités du.mat fichiers que vous souhaitez prendre en charge.
J'ai écrit un "petit" (environ 700 lignes) script Python qui peut lire des .matfichiers de base . Je ne suis ni un expert Python ni un débutant et il m'a fallu environ deux jours pour l'écrire (en utilisant la documentation MathWorks liée ci-dessus). J'ai appris beaucoup de nouvelles choses et c'était assez amusant (la plupart du temps). Comme j'ai écrit le script Python au travail, j'ai bien peur de ne pas pouvoir le publier ... Mais je peux vous donner quelques conseils ici:
.matfichier de référence que vous souhaitez analyser.miCOMPRESSED, miMATRIX, mxDOUBLEou miINT32).matstructure des fichiers est optimale pour enregistrer les éléments de données dans une structure de données arborescente; chaque nœud a une classe et des sous-nœudsfrom 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)
Vous pouvez utiliser le code ci-dessus pour lire le fichier .mat enregistré par défaut en Python.