web-dev-qa-db-fra.com

Lire des fichiers .mat dans Python

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

324
Gilad Naor

Une importation est requise, import scipy.io...

import scipy.io
mat = scipy.io.loadmat('file.mat')
442
Gilad Naor

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
132
vikrantt

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')
22
Bhanu Pratap Singh

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.

13
Cleb

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)
11
Daniel

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.

9
Daksh

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:

  • Lisez d'abord la documentation.
  • Utilisez un éditeur hexadécimal (tel que HxD ) et examinez le fichier de référence .mat- que vous souhaitez analyser.
  • Essayez de comprendre la signification de chaque octet en enregistrant les octets dans un fichier .txt et annotez chaque ligne.
  • Utilisez des classes pour enregistrer chaque élément de données (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 des sous-noeuds
5
mozzbozz