2009-05-17 13 views
234

Quelqu'un a-t-il une expérience réussie en lisant des fichiers .mat Matlab binaires en Python?Lire des fichiers .mat en Python

(je l'ai vu que scipy a prétendu soutien à la lecture .mat fichiers, mais je ne suis pas réussi avec elle. Je l'ai installé scipy la version 0.7.0, et je ne peux pas trouver la méthode loadmat())

Répondre

339

Que je suis bête. J'ai oublié d'importer io ...

import scipy.io 
mat = scipy.io.loadmat('file.mat') 
+3

Didacticiel SciPy.io officiel: http://docs.scipy.org/doc/scipy/reference/tutorial/io.html –

+13

scipy ne prend pas en charge les fichiers mat v7.3 (voir les notes [ici] (http : //docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.io.loadmat.html)). Voir la [réponse par vikrantt] (http://stackoverflow.com/a/19340117/674976) pour la solution. – texnic

+0

Toutefois, vous pouvez enregistrer des fichiers mat en tant que versions antérieures. voir: http://www.mathworks.com/help/matlab/import_export/mat-file-versions.html (en-tête: 'Enregistrer dans la version MAT-File') – watsonic

92

Ni scipy.io.savemat, ni scipy.io.loadmat travail pour les tableaux de Matlab --v7.3. Mais la bonne partie est que matlab --v7.3 fichiers sont des jeux de données hdf5. Donc, ils peuvent être lus en utilisant un certain nombre d'outils, y compris 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 numpy array 
+3

Cela fonctionne très bien, si vous utilisez l'indicateur '-v7.3' dans Matlab lors de la sauvegarde de vos données. Utiliser la valeur par défaut 'save' (au moins dans Matlab R2014b) donne un fichier qui ne peut pas être lu en utilisant la technique ci-dessus. Si vous utilisez le drapeau '-v7.3', les données numériques peuvent être lues correctement. – chipaudette

+2

Oui, c'est ce que j'ai dit dans mon post. Vous devez utiliser -v7.3 lors de l'enregistrement dans Matlab. Vous devriez le faire de toute façon car il utilise un format meilleur/plus supporté/standardisé. – vikrantt

+2

Pourriez-vous expliquer quelle est la relation entre _f_ et _data_ dans votre exemple? Comment puis-je déplacer _f_ dans un tableau numpy? – heracho

4

Il existe également le MATLAB Engine for Python de MathWorks lui-même. Si vous avez Matlab, cela peut 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 (probablement pas de problème si ces personnes ont Matlab, sinon NumPy est peut-être la bonne façon d'y aller?).

Aussi, si vous voulez faire toutes les bases vous, MathWorks provides (si les changements de lien, essayez de google pour matfile_format.pdf ou 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 pensais personnellement, mais de toute évidence, ce n'est pas le moyen le plus facile d'y aller. Cela dépend également du nombre de fonctionnalités des fichiers .mat que vous souhaitez prendre en charge.

J'ai écrit un script Python "petit" (environ 700 lignes) 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 (en utilisant la documentation de MathWorks ci-dessus). J'ai appris beaucoup de choses nouvelles et c'é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:

  • d'abord lire la documentation
  • Utilisez un éditeur HEX-(tels que HxD) et regarder dans une référence .mat -file vous voulez analyser
  • Essayez de comprendre la signification de chaque octet en enregistrant les octets dans un fichier txt et annoter chaque ligne
  • Utilisez les classes pour enregistrer chaque donnée élément (tel que miCOMPRESSED, miMATRIX, mxDOUBLE ou miINT32)
  • La structure des fichiers .mat est optimale pour enregistrer les éléments de données dans une structure de données arborescente; chaque noeud a une classe et sous-noeuds
+7

C'est une documentation assez fou fournie par mathworks. 40 pages expliquant le format, sans mentionner qu'il s'agit d'un sous-ensemble de HDF5. – Daniel

+0

est votre code sur github n'importe où? – ErroriSalvo

+1

@ErroriSalvo Non, désolé. Je l'ai fait au travail, pas pendant mon temps libre, donc je ne peux pas partager le code. Aussi jamais vraiment poli, était plus une preuve de concept. – mozzbozz

6

Ayant Matlab 2014b ou plus récent installé, le Matlab engine for Python pourrait être utilisé:

import matlab.engine 
eng = matlab.engine.start_matlab() 
content = eng.load("example.mat",nargout=1) 
17

J'ai déjà vissé une demi-heure après avoir lu les réponses. Espérons que cette réponse aide

d'abord enregistrer le fichier matelassée

save('test.mat','-v7') 

Après cela en Python utiliser la loadmat habituelle

import scipy.io as sio 
test = sio.loadmat('test.mat') 
0

Lecture du fichier

import scipy.io 
mat = scipy.io.loadmat(file_name) 

Insecting le type de tapis varia ble

print(type(mat)) 
#OUTPUT - <class 'dict'> 

Les clés dans le dictionnaire sont variables Matlab et les valeurs sont les objets assignés à ces variables.