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().

Était-ce utile?

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 ou miINT32)
  • 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top