SciPy, input dan output dalam MATLAB


SciPy (diucapkan sai pie) adalah paket aplikasi matematika berdasarkan ekstensi Numpy Python. Dengan SciPy, sesi Python interaktif berubah menjadi lingkungan pemrosesan data dan prototipe lengkap yang sama untuk sistem yang kompleks seperti MATLAB, IDL, Octave, R-Lab dan SciLab. Dalam posting ini, saya ingin berbicara tentang kemampuan paket I / O scipy.io, yang memungkinkan Anda untuk bekerja dengan file data Octave dan MATLAB.


Pendahuluan


Pertama, impor paket scipy.io sebagai berikut:


import scipy.io as sio 

Prosedur utama paket scipy.io yang memungkinkan Anda untuk bekerja dengan file MATLAB:


 sio.loadmat sio.savemat sio.whosmat 

Agar tidak melanggar perjanjian lisensi MATLAB, kami akan bekerja di lingkungan GNU Octave, yang memiliki fungsi simpan dan muat yang kompatibel dengan MATLAB. Pada prompt Oktaf, masukkan:


 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 

Kode untuk mengimpor file MATLAB dengan 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) 

Seperti yang Anda lihat, file itu dibaca dengan benar. Sekarang pertimbangkan untuk mengekspor dari SciPy ke MATLAB:


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

 (10,) 

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

Impor file Python ke dalam Oktaf:


 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 

Untuk memeriksa isi file MATLAB tanpa membaca data dalam memori, gunakan perintah whosmat:


 sio.whosmat ('octave_a.mat') 

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

Fungsi whosmat mengembalikan daftar tupel, satu untuk setiap array (atau objek lain) yang terkandung dalam file MATLAB. Setiap tuple berisi nama, konten file, dan tipe data.


Struktur MATLAB


Struktur MATLAB mirip dengan kamus dicts Python. Perbedaannya adalah bahwa nama bidang harus berupa string. Nilai bidang dapat berupa objek apa pun.
Ingatlah bahwa MATLAB adalah akronim dari MATrix LABoratory. Karena tujuan utama MATLAB adalah untuk bekerja dengan matriks, jadi semua objek di dalamnya adalah matriks. Bahkan angka tunggal direpresentasikan sebagai matriks ukuran (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 

Unduh struktur MATLAB dengan 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')]) 

Dalam versi SciPy dari 0.12.0, struktur MATLAB dikembalikan sebagai array terstruktur numpy. Nama field array numpy adalah nama field dalam struktur MATLAB. Nama bidang dapat dibaca menggunakan perintah dtype, seperti pada contoh di atas. Pelajari lebih lanjut tentang tipe data array terstruktur .


Jadi, dalam MATLAB, susunan struktur memiliki ukuran setidaknya 2D, yang diulang saat membaca di SciPy. Untuk mengurangi dimensi menjadi 1, gunakan parameter squeeze_me:


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

 () 

Terkadang lebih mudah untuk memuat struktur MATLAB sebagai objek python daripada array numpy. Untuk melakukan ini, gunakan struct_as_record = Parameter salah untuk memuat.


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

 array([[1.]]) 

Struct_as_record = Parameter salah berfungsi dengan baik bersama dengan 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 

Cara termudah untuk mengekspor struktur dari python ke MATLAB adalah dengan kamus dicts:


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

Dalam MATLAB dimuat sebagai:


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

Anda juga dapat mengekspor struktur dari python ke MATLAB menggunakan array 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}) 

Susunan sel (sel) MATLAB


Susunan sel dalam MATLAB seperti daftar python. Elemen dalam array sel dapat berisi semua jenis objek MATLAB. Selain itu, sel sangat mirip dengan array objek numpy. Pertimbangkan contoh mengekspor sel dari MATLAB ke 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 

Kembali ke 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 

Kami akan mengekspor dari numpy ke array sel MATLAB menggunakan array objek 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}) 

Periksa apakah ekspor sel dari numpy ke Oktaf sudah benar:


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

Ini mungkin akhirnya. Saya berharap bagi seseorang artikel ini akan berfungsi sebagai dalih untuk mengintegrasikan penelitian ke dalam MATLAB dengan perangkat lunak bebas.
Sumber: dokumentasi yang lemah

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


All Articles