Tuto Python-SciPy : manipuler les tableaux Matlab

Table des matières

Introduction

Le module Scipy.io

Exportation de données au format Matlab

Importer des données à partir du format Matlab

Lister les variables d’un fichier .mat

Exercices

Conclusion

Introduction :

Bienvenue dans un nouveau tutoriel Python ! Nous sommes de retour avec une nouvelle notion. Aujourd’hui nous allons voir comment manipuler des tableaux matlab avec Scipy. Ce cours sera très intéressant et riche en informations. Il suffit de bien suivre et d’appliquer les différents exemples et exercices fournis.

À la fin de ce tutoriel, vous serez capable  de manipuler un fichier matlab en utilisant la librairie Scipy et cela soit en enregistrant des données sous l’extension .mat ou bien ouvrir un fichier .mat dans Jupyter, finalement vous allez aussi apprendre à lister les variables d’un fichier matlab.

Ce cours est plein d’exemple et d’exercices afin de vous permettre de bien manipuler ces fonctionnalités ! Toutes les raisons sont bonnes pour commencer ce cours ! Allons-y.

Le module Scipy.io :

Scipy.io (input et output) est un sous-module de Scipy pour lire des données et écrire des données vers une variété de formats de fichiers (.mat , idl ,fichiers Fortran ,Matrix Market file, fichier arrf ). Dans ce tutoriel, nous allons nous intéresser à la manipulation des fichiers .mat de MATLAB.

Nous allons voir comment exporter des données au format MATLAB, importer des données d’un fichier MATLAB puis comment énumérer les variables dans un fichier MATLAB.

Exportation de données au format Matlab :

Dans cette première partie du tutoriel, nous allons voir comment exporter des données au format Matlab en utilisant la fonction savemat().

savemat() :

Cette fonction permet d’enregistrer un dictionnaire de mots et de tableaux donnés dans un fichier .mat de style MATLAB.

scipy.io.savemat(file_namemdictappendmat=Trueformat='5'long_field_names=Falsedo_compression=Falseoned_as='row')

Les paramètres de la fonction sont :

  • file_name : str Nom du fichier mat (ne nécessite pas l’extension .mat si appendmat==True). Peutégalement passer un objet ouvert de type fichier .
  • mdict : dict: Dictionnaire à partir duquel enregistrer les variables matfile .
  • appendmat : booléen : optionnelTrue pour ajouter l’extension .mat à la fin du nom de fichier, si elle n’est pas déjà présente.
  • format optionnel ,« 5 » (par défaut) pour les fichiers MATLAB 5 et supérieurs (à 7.2), « 4 » pour les fichiers MATLAB 4.
  • Long_field_names : booléen, optionnelFalse (la valeur par défaut) - la longueur maximale du nom de champ dans une structure est de 31 caractères, soit la longueur maximale documentée. True - la longueur maximale du nom de champ dans une structure est de 63 caractères
  • Do_compression: booléen, optionnel: Compresser ou non les matrices en écriture. La valeur par défaut est False.

Exemple :

Voici un exemple où on crée une liste de 20 chiffres puis on sauvegarde le fichier sous .mat .

Syntaxe :

from scipy.io import savemat
import numpy as np
liste = np.arange(20)
mat_dic = {"liste": liste, "label": "echantillon"}
mat_dic
{'liste': np.array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19]),
'label': 'echantillon'}
savemat("fichier_matlab.mat", mat_dic)

Résultat de l’exécution :

Pour vérifier le résultat de l’exécution, il suffit de vous placer dans le dossier où vous écrivez votre code et vous obtiendrez un nouveau fichier .mat dans votre dossier.

Exemple :

Nous allons Exporter le tableau suivant sous le nom de variable "var" dans un fichier mat :

Syntaxe :

from scipy import io
import numpy as np
tab = np.arange(10)
io.savemat('tab.mat', {"var": tab})

Résultat de l’exécution :

Exemple :

Syntaxe :

import scipy.io as io
import numpy as np
fruit_1=np.array(['Pomme'])
fruit_2=np.array(['Poire'])
dic={}
dic['fruit_1']=fruit_1
dic['fruit_2']=fruit_2
io.savemat('fruits',dic)

Résultat de l’exécution :

Dans la section suivante, nous allons voir comment importer des fichiers .mat !

Importer des données à partir du format Matlab :

La fonction loadmat() nous permet d’importer des données depuis un fichier Matlab.

Loadmat() :

scipy.io.loadmat(file_namemdict=Noneappendmat=True**kwargs)

Les paramètres de la function loadmat() sont les suivants :

  • file_name: Nom du fichier mat (ne nécessite pas l’extension .mat si appendmat==True). Peut également passer un objet ouvert de type fichier.
  • mdict : Dictionnaire à partir duquel enregistrer les variables matfile.
  • appendmat : True pour ajouter l’extension .mat à la fin du nom de fichier, si elle n’est pas déjà présente.
  • byte_order : Aucun par défaut, ce qui implique un ordre d’octets deviné à partir du fichier mat.
  • mat_dtype: Si True, renvoie les tableaux dans le même dtype que celui qui serait chargé dans MATLAB (au lieu du dtype avec lequel ils sont enregistrés).
  • squeeze_me: Que ce soit pour comprimer les dimensions de la matrice unitaire ou non.
  • chars_as_strings : Si vous voulez convertir les tableaux char en tableaux chaîne.
  • Matlab_compatible : Retourne les matrices qui seraient chargées par MATLAB.
  • Struct_as_record : charger des tableaux en tant que tableaux d’enregistrement Numpy. Le paramètre par défaut est True pour permettre un chargement plus facile des enregistrements.
  • Verify_compressed_data_integrity: Si la longueur des séquences compressées dans le fichier MATLAB doit être vérifiée, pour s’assurer qu’elles ne sont pas plus longues que prévu.Il est conseillé de l’activer (la valeur par défaut) car des séquences compressées trop longues dans les fichiers MATLAB indiquent généralement que les fichiers ont subi une sorte de corruption.
  • variable_names: Si None (la valeur par défaut) - lire toutes les variables dans le fichier. Sinon, variable_names devrait être une séquence de chaînes, donnant les noms des variables MATLAB à lire à partir du fichier. Le lecteur sautera n’importe quelle variable avec un nom qui n’est pas dans cette séquence, peut-être enregistrer un traitement de lecture.
  • simplify_cells : Si True, renvoie une structure dict simplifiée (ce qui est utile si le fichier mat contient des tableaux de cellules). Notez que cela n’affecte que la structure du résultat et non son contenu (qui est identique pour les deux structures de sortie).Si True, cela définit automatiquement struct_as_record à False et squeeze_me à True, ce qui est nécessaire pour simplifier les cellules.

Exemple :

Dans cet exemple, nous allons créer un vecteur de nombres, l’enregistrer sous un fichier matlab ensuite l’importer grâce à la fonction loadmat() du sous module io .

Syntaxe :

from scipy import io
import numpy as np
tab1 = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9,])
# Export:
io.savemat('tab1.mat', {"vecteur": tab1})
# Import:
nv_fichier = io.loadmat('tab1.mat')
print (nv_fichier)

Résultat de l’exécution :

Utilisez le nom de variable "vecteur" pour afficher uniquement le tableau à partir des données matlab :

Print (nv_fichier ['vecteur'] )

Nous pouvons voir que le tableau était à l’origine 1D, mais lors de l’extraction, il a augmenté d’une dimension.

Pour résoudre ce problème, nous pouvons passer un argument supplémentaire squeeze_me=True :

# Import:
nv_fichier = io.loadmat('tab1.mat', squeeze_me=True)
print(nv_fichier['vecteur'])

Exemple :

Voici un autre exemple où nous utiliserons quelques fonctionnalités de plus.

Syntaxe :

On commence tout d’abord par importer notre fichier :

import scipy.io as sio
data= sio.loadmat('tab1.mat')

Ensuite, on utilise keys() pour avoir un dictionnaire qui retourne une paire clé/valeur pour chaque variable :

data.keys() 

Résultat de l’exécution :

Dans la prochaine section, nous allons voir comment lister les variables  d’un fichier .mat .

Lister les variables d’un fichier .mat

whosmat() :

Cette fonction permet de lister les variables d’un fichier matlab.

scipy.io.whosmat(file_nameappendmat=True**kwargs)

Les paramètres de cette fonction sont :

  • File_name : str : Nom du fichier mat (ne nécessite pas l’extension .mat si appendmat==True).Peut également passer un objet ouvert de type fichier.
  • Appendmat : booléen, optionnel :True pour ajouter l’extension .mat à la fin du nom de fichier, si elle n’est pas déjàprésente.
  • Byte_order : str, optionnel : Aucun par défaut, ce qui implique un ordre d’octets deviné à partir du fichier mat.
  • Mat_dtype : booléen, optionnel : Si True, renvoie les tableaux dans le même dtype que celui qui serait chargé dans MATLAB (au lieu du dtype avec lequel ils sont enregistrés).
  • Squeeze_me : booléen, optionnel : Que ce soit pour comprimer les dimensions de la matrice unitaire ou non.
  • Char_as_strings : booléen, optionnel:  TrueSi vous voulez convertir les tableaux char en tableaux chaîne.
  • Matlab_compatible: booléen , optionnel: renvoie les matrices qui seraient chargées par MATLAB.
  • Struct_as_record: booléen, optionnel: chargerdes tableaux autant que tableaux d’enregistrement Numpy. Le paramètre par défaut est True pour permettre un chargement plus facile des enregistrements.

Exemple :

Dans ce premier exemple, nous allons importer un fichier matlab qui existe déjà et lister les différentes variables de ce fichier.

Syntaxe :

import scipy.io as sio
contenu_fichier_mat = sio.whosmat('tab1.mat')
print (contenu_fichier_mat)

Résultat de l’exécution :

Exemple :

Dans ce deuxième exemple, nous allons créer et sauvegarder un fichier matlab. Ensuite, nous allons

L’ouvrir et lister les différentes variables.

Syntaxe :

import scipy.io as sio
import numpy as np
#Sauvegarder un fichier matlab
vecteur = np.arange(5)
sio.savemat('tableau.mat',{'vecteur':vecteur})
#Importer le fichier
donnees = sio.loadmat('tableau.mat')
print (donnees)
#Lister les variables
contenu_fichier_mat = sio.whosmat('tableau.mat')
print (contenu_fichier_mat)

Résultat de l’exécution :

Maintenant nous allons passer à des exercices afin de mieux appliquer les fonctions apprises dans ce tutoriel .

Exercices :

Exercice 1 :

Enoncé :

Dans cet exercice, on veut créer un dictionnaire puis le sauvegarder sous .mat pour l’ouvrir par la suite.

Le dictionnaire a 5 pairs clé/valeur :

valeur1 : [ 1,2,3,4]

valeur2 : [10,20,30,40 ]

valeur3 : [100,200,300,400 ]

valeur4 : [1000,2000,3000,4000]

valeur5 : [ 10000,20000,30000,40000]

À vous de jouer !

Correction :

import scipy.io as io
import numpy as np
x1=np.array([1,2,3,4])
x2=np.array([10,20,30,40])
x3=np.array([100,200,300,400])
x4=np.array([1000,2000,3000,4000])
x5=np.array([10000,20000,30000,40000])
dic={}
dic ['valeur1']=x1
dic ['valeur2']=x2
dic ['valeur3']=x3
dic ['valeur4']=x4
dic ['valeur5']=x5
io.savemat ('temp',dic)
b = io.loadmat('temp')
print (b['valeur1'])
print (b['valeur2'])
print (b['valeur3'])
print (b['valeur4'])
print (b['valeur5'])

Exercice 2 :

Enoncé :

Similaire à l’exercice précèdent , mais cette fois-ci vous devez créer un dictionnaire des utilisateurs suivants :

utilisateur_1= (['John', 20, 3900,'Present'])
utilisateur_2= (['Albert', 45, 6700,'Present'])
utilisateur_3= (['Ken', 33, 3000,'Present'])
utilisateur_4= (['Leticia', 55, 3000,'Absent'])
utilisateur_5= (['Kate', 18, 3008,'Present'])

Correction :

import scipy.io as io
import numpy as np
utilisateur_1=np.array(['John', 20, 3900,'Present'])
utilisateur_2=np.array(['Albert', 45,6700,'Present'])
utilisateur_3=np.array(['Ken', 33,3000,'Present'])
utilisateur_4=np.array (['Leticia', 55, 3000,'Absent'])
utilisateur_5=np.array (['Kate', 18, 3008,'Present'])
dic= {}
dic ['utilisateur_1']= utilisateur_1
dic ['utilisateur_2']= utilisateur_2
dic ['utilisateur_3']= utilisateur_3
dic ['utilisateur_4']= utilisateur_4
dic ['utilisateur_5']= utilisateur_5
io.savemat('temp',dic)
b = io.loadmat('temp')
print(b['utilisateur_1'])
print (b['utilisateur_2'])
print (b['utilisateur_3'])
print (b['utilisateur_4'])
print (b['utilisateur_5'])

Exercice 3 :

Enoncé :

Dans ce dernier exemple, on veut créer un dictionnaire de deux variables. var1 qui contient une valeur entière entre 10 et 3 et var2 qui contient une matrice de zéros de taille 2x3.

Correction :

import numpy as np, scipy.io
>>> data_1 = {"var1": np.random.random((10,3)), "var2": np.zeros((1,2,3), dtype=int)}
>>> scipy.io.savemat("data_1.mat", data_1)
>>> scipy.io.whosmat("data_1.mat")

Résultat de l’exécution :

Conclusion :

Nous sommes arrivés à la fin de ce tutoriel, nous estimons que maintenant la manipulation de fichiers matlab en python est devenue claire pour vous. Maintenant vous êtes capable de transformer des données et les enregistrer sous un format .mat et inversement.

Nous vous conseillons de refaire les exemples et exercices de ce tutoriel puis d’essayer de coder votre propre exemple afin de bien maitriser les fonctionnalités présentées dans ce cours.

Le module est Scipy est très riche et ce n’est qu’une petite dégustation de ce que ce dernier offre. Nous vous invitons donc vivement à  découvrir les autres tutoriels !

Vous êtes sur la bonne route, continuez ainsi . Bon courage et à prochain tutoriel chers lecteurs.

Article publié le 29 Octobre 2020par Mouna HAMIM