SciPy, Eingabe und Ausgabe in MATLAB


SciPy (ausgesprochen sai pie) ist ein mathematisches Anwendungspaket, das auf der Erweiterung Numpy Python basiert. Mit SciPy wird aus einer interaktiven Python-Sitzung dieselbe komplexe Datenverarbeitungs- und Prototyping-Umgebung für komplexe Systeme wie MATLAB, IDL, Octave, R-Lab und SciLab. In diesem Beitrag möchte ich über die Möglichkeiten des scipy.io-E / A-Pakets sprechen, mit dem Sie mit Octave- und MATLAB-Datendateien arbeiten können.


Einführung


Importieren Sie zunächst das Paket scipy.io wie folgt:


import scipy.io as sio 

Die wichtigsten Verfahren des scipy.io-Pakets, mit denen Sie mit MATLAB-Dateien arbeiten können:


 sio.loadmat sio.savemat sio.whosmat 

Um die MATLAB-Lizenzvereinbarung nicht zu verletzen, arbeiten wir in der GNU Octave-Umgebung, die mit MATLAB kompatible Funktionen zum Speichern und Laden bietet. Geben Sie an der Octave-Eingabeaufforderung Folgendes ein:


 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 zum Importieren der MATLAB-Datei in 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) 

Wie Sie sehen können, wurde die Datei korrekt gelesen. Erwägen Sie nun den Export von SciPy nach MATLAB:


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

 (10,) 

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

Importieren Sie die Python-Datei in 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 

Verwenden Sie den Befehl whosmat, um den Inhalt der MATLAB-Datei zu überprüfen, ohne die Daten im Speicher zu lesen:


 sio.whosmat ('octave_a.mat') 

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

Die Whosmat-Funktion gibt eine Liste von Tupeln zurück, eines für jedes Array (oder andere Objekt), das in der MATLAB-Datei enthalten ist. Jedes Tupel enthält einen Namen, einen Dateiinhalt und einen Datentyp.


MATLAB-Strukturen


MATLAB-Strukturen ähneln Python-Wörterbüchern. Der Unterschied besteht darin, dass der Feldname eine Zeichenfolge sein muss. Der Feldwert kann ein beliebiges Objekt sein.
Denken Sie daran, dass MATLAB eine Abkürzung für MATrix LABoratory ist. Weil Der Hauptzweck von MATLAB besteht darin, mit Matrizen zu arbeiten, sodass alle darin enthaltenen Objekte Matrizen sind. Sogar eine einzelne Zahl wird als Matrix der Größe (1, 1) dargestellt.


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

Laden Sie die MATLAB-Struktur in Python herunter:


 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')]) 

In SciPy-Versionen ab 0.12.0 werden MATLAB-Strukturen als numpy-strukturierte Arrays zurückgegeben. Die Feldnamen des Numpy-Arrays sind die Namen der Felder in der MATLAB-Struktur. Feldnamen können mit dem Befehl dtype wie im obigen Beispiel gelesen werden. Weitere Informationen zu Datentypen für strukturierte Arrays .


Somit hat in MATLAB ein Array von Strukturen eine Größe von mindestens 2D, was beim Lesen in SciPy wiederholt wird. Verwenden Sie den Parameter squeeze_me, um die Dimension auf 1 zu reduzieren:


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

 () 

Manchmal ist es bequemer, MATLAB-Strukturen als Python-Objekte zu laden, als Numpy-Arrays. Verwenden Sie dazu den Parameter struct_as_record = False zum Laden.


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

 array([[1.]]) 

Der Parameter struct_as_record = False funktioniert hervorragend in Verbindung mit dem Parameter 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 

Der einfachste Weg, Strukturen aus Python nach MATLAB zu exportieren, sind Wörterbücher:


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

In MATLAB wird Folgendes geladen:


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

Sie können Strukturen auch mithilfe von Numpy-Arrays aus Python nach MATLAB exportieren:


 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}) 

Arrays von Zellen (Zelle) MATLAB


Arrays von Zellen in MATLAB sind wie Python-Listen. Elemente in Zellenarrays können jede Art von MATLAB-Objekt enthalten. Auch Zellen sind Numpy-Objekt-Arrays sehr ähnlich. Betrachten Sie ein Beispiel für den Export einer Zelle aus MATLAB nach 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 

Zurück zu 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 

Wir werden von numpy mit einem numpy-Array von Objekten in das Zellenarray MATLAB exportieren:


 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}) 

Überprüfen Sie, ob der Export der Zelle von numpy nach Octave korrekt ist:


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

Dies ist vielleicht das Ende. Ich hoffe, dass dieser Artikel für jemanden als Vorwand für die Integration der Forschung in MATLAB mit freier Software dient.
Quelle: Scipy-Dokumentation

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


All Articles