SciPy, entrée et sortie dans MATLAB


SciPy (prononcé sai pie) est un ensemble de procédures mathématiques appliquées basées sur l'extension Numpy Python. Avec SciPy, une session Python interactive se transforme en le même environnement complet de traitement de données et de prototypage pour des systèmes complexes comme MATLAB, IDL, Octave, R-Lab et SciLab. Dans cet article, je voudrais parler des capacités du package d'E / S scipy.io, qui vous permet de travailler avec des fichiers de données Octave et MATLAB.


Présentation


Tout d'abord, importez le package scipy.io comme suit:


import scipy.io as sio 

Les principales procédures du package scipy.io qui vous permettent de travailler avec des fichiers MATLAB:


 sio.loadmat sio.savemat sio.whosmat 

Afin de ne pas violer l'accord de licence MATLAB, nous travaillerons dans l'environnement GNU Octave, qui a des fonctions de sauvegarde et de chargement compatibles avec MATLAB. À l'invite Octave, entrez:


 octave:1> a = 1:12 a = 1 2 3 4 5 6 7 8 9 10 11 12 octave:2> a = reshape(a, [1 3 4]) a = ans(:,:,1) = 1 2 3 ans(:,:,2) = 4 5 6 ans(:,:,3) = 7 8 9 ans(:,:,4) = 10 11 12 octave:3> save -6 octave_a.mat a % MATLAB 6 compatible octave:4> ls octave_a.mat octave_a.mat 

Code pour importer le fichier MATLAB en Python:


 mat_contents = sio.loadmat('octave_a.mat') mat_contents 

  {'__header__': b'MATLAB 5.0 MAT-file, written by Octave 4.2.2, 2019-02-02 20:26:43 UTC', '__version__': '1.0', '__globals__': [], 'a': array([[[ 1., 4., 7., 10.], [ 2., 5., 8., 11.], [ 3., 6., 9., 12.]]])} 

 oct_a = mat_contents['a'] oct_a 

  array([[[ 1., 4., 7., 10.], [ 2., 5., 8., 11.], [ 3., 6., 9., 12.]]]) 

 oct_a.shape 

 (1, 3, 4) 

Comme vous pouvez le voir, le fichier a été lu correctement. Pensez maintenant à exporter de SciPy vers MATLAB:


 import numpy as np vect = np.arange (10) vect.shape 

 (10,) 

 sio.savemat ('np_vector.mat', {'vect': vect}) 

Importez le fichier Python dans Octave:


 octave:8> load np_vector.mat octave:9> vect vect = 0 1 2 3 4 5 6 7 8 9 octave:10> size(vect) ans = 1 10 

Pour vérifier le contenu du fichier MATLAB sans lire les données en mémoire, utilisez la commande whosmat:


 sio.whosmat ('octave_a.mat') 

 [('a', (1, 3, 4), 'double')] 

La fonction whosmat renvoie une liste de tuples, un pour chaque tableau (ou autre objet) contenu dans le fichier MATLAB. Chaque tuple contient un nom, un contenu de fichier et un type de données.


Structures MATLAB


Les structures MATLAB sont similaires aux dictionnaires de dictées Python. La différence est que le nom du champ doit être une chaîne. La valeur du champ peut être n'importe quel objet.
Rappelons que MATLAB est l'acronyme de MATrix LABoratory. Parce que l'objectif principal de MATLAB est de travailler avec des matrices, donc tous les objets qu'il contient sont des matrices. Même un seul nombre est représenté comme une matrice de taille (1, 1).


 octave:11> my_struct = struct('field1', 1, 'field2', 2) my_struct = { field1 = 1 field2 = 2 } octave:12> save -6 octave_struct.mat my_struct 

Téléchargez la structure MATLAB en Python:


 mat_contents = sio.loadmat('octave_struct.mat') mat_contents 

 {'__header__': b'MATLAB 5.0 MAT-file, written by Octave 4.2.2, 2019-02-02 20:34:26 UTC', '__version__': '1.0', '__globals__': [], 'my_struct': array([[(array([[1.]]), array([[2.]]))]], dtype=[('field1', 'O'), ('field2', 'O')])} 

 oct_struct = mat_contents['my_struct'] oct_struct.shape 

 (1, 1) 

 val = oct_struct[0,0] val 

 (array([[1.]]), array([[2.]])) 

 val['field1'] 

 array([[1.]]) 

 val['field2'] 

 array([[2.]]) 

 val.dtype 

 dtype([('field1', 'O'), ('field2', 'O')]) 

Dans les versions SciPy de 0.12.0, les structures MATLAB sont renvoyées sous forme de tableaux structurés numpy. Les noms de champs du tableau numpy sont les noms des champs de la structure MATLAB. Les noms de champ peuvent être lus à l'aide de la commande dtype, comme dans l'exemple ci-dessus. En savoir plus sur les types de données des tableaux structurés .


Ainsi, dans MATLAB, un tableau de structures a une taille d'au moins 2D, qui est répétée lors de la lecture dans SciPy. Pour réduire la dimension à 1, utilisez le paramètre squeeze_me:


 mat_contents = sio.loadmat ('octave_struct.mat', squeeze_me = True) oct_struct = mat_contents ['my_struct'] oct_struct.shape 

 () 

Il est parfois plus pratique de charger des structures MATLAB en tant qu'objets python plutôt que des tableaux numpy. Pour ce faire, utilisez le paramètre struct_as_record = False pour charger.


 mat_contents = sio.loadmat ('octave_struct.mat', struct_as_record = False) oct_struct = mat_contents ['my_struct'] oct_struct[0,0].field1 

 array([[1.]]) 

Le paramètre struct_as_record = False fonctionne très bien avec le paramètre squeeze_me:


 mat_contents = sio.loadmat('octave_struct.mat', struct_as_record=False, squeeze_me=True) oct_struct = mat_contents['my_struct'] oct_struct.shape #  , ..     shape 

 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-23-d41d0a59bb9b> in <module> 1 mat_contents = sio.loadmat('octave_struct.mat', struct_as_record=False, squeeze_me=True) 2 oct_struct = mat_contents['my_struct'] ----> 3 oct_struct.shape #  , ..   AttributeError: 'mat_struct' object has no attribute 'shape' 

 type(oct_struct) 

 scipy.io.matlab.mio5_params.mat_struct 

 oct_struct.field1 

 1.0 

La façon la plus simple d'exporter des structures de python vers MATLAB est avec les dictionnaires dicts:


 a_dict = {'field1': 0.5, 'field2': 'a string'} sio.savemat ('saved_struct.mat', {'a_dict': a_dict}) 

Dans MATLAB, il se charge comme:


 octave:21> load saved_struct octave:22> a_dict a_dict = scalar structure containing the fields: field1 = 0.50000 field2 = a string 

Vous pouvez également exporter des structures de python vers MATLAB à l'aide de tableaux numpy:


 dt = [('f1', 'f8'), ('f2', 'S10')] arr = np.zeros ((2,), dtype = dt) arr 

 array([(0., b''), (0., b'')], dtype=[('f1', '<f8'), ('f2', 'S10')]) 

 arr [0] ['f1'] = 0.5 arr [0] ['f2'] = 'python' arr [1] ['f1'] = 99 arr [1] ['f2'] = 'not perl' sio.savemat ('np_struct_arr.mat', {'arr': arr}) 

Tableaux de cellules (cellule) MATLAB


Les tableaux de cellules dans MATLAB sont comme des listes python. Les éléments des tableaux de cellules peuvent contenir tout type d'objet MATLAB. De plus, les cellules sont très similaires aux tableaux d'objets numpy. Prenons un exemple d'exportation d'une cellule de MATLAB vers numpy.


 octave:14> my_cells = {1, [2, 3]} my_cells = { [1,1] = 1 [1,2] = 2 3 } octave:15> save -6 octave_cells.mat my_cells 

Retour à Python:


 mat_contents = sio.loadmat ('octave_cells.mat') oct_cells = mat_contents ['my_cells'] print (oct_cells.dtype) 

 object 

 val = oct_cells [0,0] val 

 array([[1.]]) 

 print (val.dtype) 

 float64 

Nous allons exporter de numpy vers le tableau de cellules MATLAB en utilisant un tableau d'objets numpy:


 obj_arr = np.zeros ((2,), dtype = np.object) obj_arr [0] = 1 obj_arr [1] = 'a string' obj_arr 

 array([1, 'a string'], dtype=object) 

 sio.savemat ('np_cells.mat', {'obj_arr': obj_arr}) 

Vérifiez si l'exportation de la cellule de numpy vers Octave est correcte:


 octave:16> load np_cells.mat octave:17> obj_arr obj_arr = { [1,1] = 1 [2,1] = a string } 

C'est peut-être la fin. J'espère pour quelqu'un que cet article servira de prétexte pour intégrer la recherche dans MATLAB avec le logiciel libre.
Source: documentation scipy

Source: https://habr.com/ru/post/fr438600/


All Articles