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