SciPy ، المدخلات والمخرجات في MATLAB


SciPy (وضوح sai pie) عبارة عن حزمة تطبيق رياضية تستند إلى ملحق Numpy Python. باستخدام SciPy ، تتحول جلسة Python التفاعلية إلى نفس بيئة معالجة البيانات والنماذج الأولية الكاملة للأنظمة المعقدة مثل MATLAB و IDL و Octave و R-Lab و SciLab. في هذا المنشور ، أود أن أتحدث عن إمكانيات حزمة الإدخال / الإخراج scipy.io ، والتي تتيح لك العمل مع ملفات بيانات Octave و MATLAB.


مقدمة


أولاً ، قم باستيراد الحزمة scipy.io كما يلي:


import scipy.io as sio 

الإجراءات الرئيسية لحزمة scipy.io التي تسمح لك بالعمل مع ملفات MATLAB:


 sio.loadmat sio.savemat sio.whosmat 

حتى لا تنتهك اتفاقية ترخيص MATLAB ، سنعمل في بيئة GNU Octave ، التي لديها وظائف حفظ وتحميل متوافقة مع MATLAB. في موجه Octave ، أدخل:


 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 

رمز لاستيراد ملف MATLAB في بيثون:


 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) 

كما ترون ، تم قراءة الملف بشكل صحيح. الآن النظر في التصدير من SciPy إلى MATLAB:


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

 (10,) 

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

استيراد ملف Python إلى 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 

للتحقق من محتويات ملف MATLAB دون قراءة البيانات الموجودة في الذاكرة ، استخدم الأمر whosmat:


 sio.whosmat ('octave_a.mat') 

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

تقوم دالة whosmat بإرجاع قائمة tuples ، واحدة لكل صفيف (أو كائن آخر) موجود في ملف MATLAB. تحتوي كل مجموعة على اسم ومحتويات الملف ونوع البيانات.


هياكل ماتلاب


هياكل MATLAB تشبه قواميس بيثون. الفرق هو أن اسم الحقل يجب أن يكون سلسلة. يمكن أن تكون قيمة الحقل أي كائن.
أذكر أن MATLAB هو اختصار MATrix LABoratory. بسبب الغرض الرئيسي من MATLAB هو العمل مع المصفوفات ، وبالتالي فإن جميع الكائنات الموجودة فيها هي المصفوفات. يتم تمثيل حتى رقم واحد كمصفوفة من الحجم (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 

تنزيل هيكل MATLAB في بيثون:


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

في إصدارات SciPy من 0.12.0 ، يتم إرجاع بنيات MATLAB كصفائف مهيكلة numpy. أسماء الحقول من الصفيف numpy هي أسماء الحقول في بنية MATLAB. يمكن قراءة أسماء الحقول باستخدام الأمر dtype ، كما في المثال أعلاه. تعرف على المزيد حول أنواع بيانات المصفوفات المنظمة .


وهكذا ، في MATLAB ، يكون لمجموعة من الهياكل حجم 2D على الأقل ، والذي يتكرر عند القراءة في SciPy. لتقليل البعد إلى 1 ، استخدم المعلمة squeeze_me:


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

 () 

في بعض الأحيان يكون أكثر ملاءمة لتحميل هياكل MATLAB ككائنات بيثون بدلاً من صفائف numpy. للقيام بذلك ، استخدم struct_as_record = خطأ المعلمة لتحميل.


 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 = False بشكل رائع مع المعلمة 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 

أسهل طريقة لتصدير الهياكل من الثعبان إلى MATLAB هي القواميس المتقنة:


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

في MATLAB يتم تحميله على النحو التالي:


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

يمكنك أيضًا تصدير هياكل من بيثون إلى MATLAB باستخدام صفائف 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}) 

مصفوفات الخلايا (الخلية) MATLAB


صفائف الخلايا في MATLAB تشبه قوائم الثعبان. يمكن أن تحتوي العناصر الموجودة في صفائف الخلايا على أي نوع من كائنات MATLAB. أيضا ، خلية تشبه إلى حد كبير صفائف من الأشياء سيئة. النظر في مثال لتصدير خلية من MATLAB إلى 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 

العودة إلى بيثون:


 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 

سوف نقوم بالتصدير من numpy إلى صفيف الخلية MATLAB باستخدام مجموعة 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}) 

تحقق من صحة تصدير الخلية من numpy إلى Octave:


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

ربما هذه هي النهاية. آمل أن يكون هذا المقال بمثابة ذريعة لدمج البحوث في MATLAB مع البرمجيات الحرة.
المصدر: وثائق scipy

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


All Articles