Est-il possible de lire des fichiers binaires MATLAB .mat en Python?
J'ai vu que SciPy prenait en charge la lecture de fichiers .mat, mais je n'ai pas réussi. J'ai installé SciPy version 0.7.0 et je ne trouve pas la méthode loadmat()
.
Une importation est requise, import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
Ni scipy.io.savemat
, ni scipy.io.loadmat
ne fonctionnent avec les tableaux MATLAB version 7.3. Mais le bon côté est que les fichiers MATLAB version 7.3 sont des jeux de données hdf5. Ils peuvent donc être lus à l'aide de plusieurs outils, notamment NumPy .
Pour Python, vous aurez besoin de l'extension h5py
, 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
Commencez par enregistrer le fichier .mat sous:
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 existe un package Nice appelé mat4py
qui peut être facilement installé à l’aide de
_pip install mat4py
_
Il est simple à utiliser (depuis le site web):
Charge les données d'un fichier MAT
La fonction loadmat
charge toutes les variables stockées dans le fichier MAT dans une simple structure de données Python, en utilisant uniquement les objets dict
et list
de Python. Les tableaux numériques et de cellules sont convertis en listes imbriquées ordonné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 format JSON .
Exemple: chargez un fichier MAT dans une structure de données Python:
_from mat4py import loadmat
data = loadmat('datafile.mat')
_
La variable data
est une dict
avec les variables et les valeurs contenues dans le fichier MAT.
Enregistrez une structure de données Python dans un fichier MAT
Les données Python peuvent être sauvegardé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
, c'est-à-dire qu'elles doivent être composées de types de données simples, comme dict
, list
, str
, int
et float
.
Exemple: Enregistrez une structure de données Python dans un fichier MAT:
_from mat4py import savemat
savemat('datafile.mat', data)
_
Le paramètre data
doit être un dict
avec les variables.
Avec MATLAB 2014b ou une version plus récente installée, le moteur MATLAB pour Python peut être utilisé:
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'>
Les clés à l'intérieur du dictionnaire sont variables MATLAB, et les valeurs sont les objets assignés à ces variables.
Il y a aussi le MATLAB Engine for Python de MathWorks lui-même. Si vous avez MATLAB, cela vaut la peine d'être pris en compte (je ne l'ai pas essayé moi-même, mais il comporte 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, peut-être que NumPy est la bonne solution?).
En outre, si vous souhaitez effectuer vous-même toutes les bases, MathWorks fournit (si le lien change, essayez de rechercher Google pour matfile_format.pdf
ou son titre MAT-FILE Format
), une documentation détaillée sur le fichier. structure du format de fichier. Ce n'est pas aussi compliqué que je le pensais personnellement, mais de toute évidence, ce n'est pas la meilleure façon de faire. Cela dépend également du nombre de fonctionnalités des fichiers .mat
- que vous souhaitez prendre en charge.
J'ai écrit un "petit" (environ 700 lignes) script Python qui peut lire des fichiers de base .mat
-. Je ne suis ni un expert Python ni un débutant et il m'a fallu environ deux jours pour l'écrire (à l'aide de 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 donner quelques conseils ici:
.mat
- que vous souhaitez analyser.miCOMPRESSED
, miMATRIX
, mxDOUBLE
ou miINT32
).mat
- est optimale pour enregistrer les éléments de données dans une structure de données arborescente; chaque noeud a une classe et des sous-noeuds