سؤال

هل من الممكن قراءة ملفات MATLAB .mat الثنائية في بايثون؟

لقد رأيت أن SciPy زعم دعمه لقراءة ملفات .mat، لكنني لم أنجح في ذلك.لقد قمت بتثبيت الإصدار 0.7.0 من SciPy، ولم أتمكن من العثور على ملف loadmat() طريقة.

هل كانت مفيدة؟

المحلول

وتبرز الحاجة إلى الاستيراد، import scipy.io ...

import scipy.io
mat = scipy.io.loadmat('file.mat')

نصائح أخرى

ولا scipy.io.savemat، ولا عمل scipy.io.loadmat لMATLAB صفائف النسخة 7.3. ولكن الجزء الجيد هو أن النسخة MATLAB 7.3 الملفات قواعد البيانات hdf5. بحيث يمكن قراءتها باستخدام عدد من الأدوات، بما في ذلك نمباي .

لبيثون، وكنت في حاجة إلى تمديد h5py، الأمر الذي يتطلب HDF5 على النظام الخاص بك.

import numpy as np
import h5py
f = h5py.File('somefile.mat','r')
data = f.get('data/variable1')
data = np.array(data) # For converting to a NumPy array

أولا حفظ الملف .mat على النحو التالي:

save('test.mat', '-v7')

وبعد ذلك، في بيثون، استخدم الدالة loadmat المعتادة:

import scipy.io as sio
test = sio.loadmat('test.mat')

هناك حزمة لطيفة تسمى mat4py والتي يمكن تثبيتها بسهولة باستخدام

pip install mat4py

إنه سهل الاستخدام (من الموقع):

تحميل البيانات من ملف MAT

الوظيفة loadmat يقوم بتحميل جميع المتغيرات المخزنة في ملف MAT إلى بنية بيانات Python بسيطة، باستخدام لغة Python فقط dict و list أشياء.يتم تحويل المصفوفات الرقمية والمصفوفات الخلوية إلى قوائم متداخلة مرتبة حسب الصفوف.يتم ضغط المصفوفات لإزالة المصفوفات التي تحتوي على عنصر واحد فقط.تتكون بنية البيانات الناتجة من أنواع بسيطة متوافقة مع JSON شكل.

مثال:قم بتحميل ملف MAT في بنية بيانات Python:

from mat4py import loadmat

data = loadmat('datafile.mat')

المتغير data هو dict بالمتغيرات والقيم الموجودة في ملف MAT.

احفظ بنية بيانات Python في ملف MAT

يمكن حفظ بيانات بايثون في ملف MAT باستخدام الوظيفة savemat.يجب أن يتم تنظيم البيانات بنفس الطريقة المتبعة في loadmat, ، أي.يجب أن تتكون من أنواع بيانات بسيطة، مثل dict, list, str, int, ، و float.

مثال:احفظ بنية بيانات Python في ملف MAT:

from mat4py import savemat

savemat('datafile.mat', data)

المعلمة data يجب أن يكون أ dict مع المتغيرات.

وبعد MATLAB 2014b أو أحدث مثبتة، MATLAB المحرك ل ويمكن استخدام بايثون :

import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)

قراءة الملف

import scipy.io
mat = scipy.io.loadmat(file_name)

فحص نوع متغير MAT

print(type(mat))
#OUTPUT - <class 'dict'>

ال مفاتيح داخل القاموس هي متغيرات ماتلاب, ، و ال قيم هي الكائنات المخصصة لتلك المتغيرات.

وهناك أيضا محرك ماتلاب لبيثون بواسطة MathWorks نفسها.إذا كان لديك MATLAB، فقد يكون هذا أمرًا يستحق التفكير فيه (لم أجربه بنفسي ولكنه يحتوي على وظائف أكثر بكثير من مجرد قراءة ملفات MATLAB).ومع ذلك، لا أعرف ما إذا كان مسموحًا بتوزيعه على مستخدمين آخرين (ربما لا تكون هناك مشكلة إذا كان هؤلاء الأشخاص لديهم MATLAB.وإلا، فربما يكون NumPy هو الطريق الصحيح؟).

وأيضًا، إذا كنت تريد القيام بكل الأساسيات بنفسك، يوفر MathWorks (إذا تغير الرابط، حاول البحث في جوجل عن matfile_format.pdf أو عنوانها MAT-FILE Format) وثائق مفصلة عن بنية تنسيق الملف.الأمر ليس معقدًا كما اعتقدت شخصيًا، ولكن من الواضح أن هذه ليست الطريقة الأسهل.يعتمد ذلك أيضًا على عدد ميزات .mat-الملفات التي تريد دعمها.

لقد قمت بكتابة نص بايثون "صغير" (حوالي 700 سطر) يمكنه قراءة بعض الأساسيات .mat-ملفات.أنا لست خبيرًا في لغة Python ولا مبتدئًا وقد استغرق الأمر مني حوالي يومين لكتابتها (باستخدام وثائق MathWorks المرتبطة أعلاه).لقد تعلمت الكثير من الأشياء الجديدة وكان الأمر ممتعًا جدًا (معظم الوقت).بما أنني كتبت نص بايثون في العمل، أخشى أنني لا أستطيع نشره...لكن يمكنني تقديم بعض النصائح هنا:

  • أولا قراءة الوثائق.
  • استخدم محررًا سداسيًا عشريًا (مثل HxD) وابحث في مرجع .mat-الملف الذي تريد تحليله.
  • حاول معرفة معنى كل بايت عن طريق حفظ البايتات في ملف .txt وإضافة تعليقات توضيحية لكل سطر.
  • استخدم الفئات لحفظ كل عنصر بيانات (مثل miCOMPRESSED, miMATRIX, mxDOUBLE, ، أو miINT32)
  • ال .matتعتبر بنية الملفات مثالية لحفظ عناصر البيانات في بنية بيانات شجرة؛تحتوي كل عقدة على فئة واحدة وعقد فرعية
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top