Lire les fichiers .mat en Python
Question
Est-il possible de lire des fichiers Matlab binaire .mat en Python?
Je l'ai vu que SciPy a prétendu soutien à la lecture .mat fichiers, mais je suis sans succès avec elle. J'ai installé la version 0.7.0 SciPy, et je ne peux pas trouver la méthode loadmat()
.
La solution
Une importation est nécessaire, import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
Autres conseils
Ni scipy.io.savemat
, ni travail de scipy.io.loadmat
pour les tableaux Matlab la version 7.3. Mais la bonne nouvelle 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'extension h5py
, ce 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
Tout d'abord enregistrer le fichier .mat comme:
save('test.mat', '-v7')
Après cela, en Python, utilisez la fonction habituelle loadmat
:
import scipy.io as sio
test = sio.loadmat('test.mat')
Il y a un joli paquet appelé mat4py
qui peut facilement être installé à l'aide
pip install mat4py
Il est simple à utiliser (du site):
Charger des données à partir d'un fichier MAT
La fonction charge loadmat
toutes les variables stockées dans le fichier MAT-en une simple structure de données Python, en utilisant uniquement les objets dict
de Python et list
. des tableaux numériques et cellulaires sont converties en rangée ordonnée des listes imbriquées. Les tableaux sont pressés pour éliminer les tableaux avec un seul élément. La structure de données résultant est composé de types simples qui sont compatibles avec le format JSON .
Exemple: charger un fichier de MAT-en une structure de données de python:
from mat4py import loadmat
data = loadmat('datafile.mat')
Le data
variable est un dict
avec les variables et les valeurs contenues dans le fichier MAT.
Enregistrer une structure de données Python à un fichier MAT
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 doit être composé de types de données simples, comme dict
, list
, str
, int
et float
.
Exemple: Enregistrer une structure de données Python à un fichier MAT:
from mat4py import savemat
savemat('datafile.mat', data)
Le paramètre data
est un dict
avec les variables.
Avoir 2014b MATLAB ou plus récent installé, le moteur Matlab pour Python pourraient être utilisés:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
Lecture du fichier
import scipy.io
mat = scipy.io.loadmat(file_name)
Contrôle du type de variable MAT
print(type(mat))
#OUTPUT - <class 'dict'>
touches dans le dictionnaire sont Variables MATLAB® et valeurs sont les objets assignés à ces variables .
Il y a aussi la Matlab Engine pour Python par MathWorks lui-même. Si vous avez Matlab, cela pourrait être utile d'envisager (je ne l'ai pas essayé moi-même, mais il a beaucoup plus de fonctionnalités que la simple lecture des fichiers Matlab). Cependant, je ne sais pas s'il est permis de le distribuer à d'autres utilisateurs (il est probablement pas un problème si ces personnes ont Matlab. Dans le cas contraire, peut-être NumPy est la bonne façon de faire?).
En outre, si vous voulez faire vous-même toutes les bases, MathWorks fournit (si les changements de lien, essayez de google pour matfile_format.pdf
ou son MAT-FILE Format
titre) une documentation détaillée sur la structure du format de fichier. Ce n'est pas aussi compliqué que je pensais personnellement, mais de toute évidence, ce n'est pas la meilleure façon d'aller. Il dépend aussi de nombreuses fonctionnalités des fichiers .mat
-vous souhaitez soutenir.
J'ai écrit un « petit » (environ 700 lignes) script Python qui peut lire certains fichiers .mat
-base. Je ne suis ni un expert, ni un débutant Python et il m'a fallu deux jours pour l'écrire (en utilisant la documentation MathWorks liée ci-dessus). J'ai appris beaucoup de choses nouvelles et il était très amusant (la plupart du temps). Comme je l'ai écrit le script Python au travail, je crains que je ne peux pas le publier ... Mais je peux donner quelques conseils ici:
- Tout d'abord lire la documentation.
- Utilisez un éditeur hexadécimal (comme HxD ) et regarder dans une référence
.mat
- le fichier que vous souhaitez analyser. - Essayez de comprendre la signification de chaque octet en enregistrant les octets dans un fichier txt et annoter chaque ligne.
- utiliser des classes pour enregistrer chaque élément de données (tels que
miCOMPRESSED
,miMATRIX
,mxDOUBLE
oumiINT32
) - La structure des fichiers de
.mat
-de est optimale pour enregistrer les éléments de données dans une structure de données d'arbre; chaque noeud a une classe et sous-noeuds