पायथन में .mat फ़ाइलें पढ़ें


383

क्या पायथन में बाइनरी MATLAB .mat फाइलें पढ़ना संभव है?

मैंने देखा है कि SciPy ने .mat फ़ाइलों को पढ़ने के लिए समर्थन का आरोप लगाया है, लेकिन मैं इसके साथ असफल हूं। मैंने SciPy संस्करण 0.7.0 स्थापित किया है, और मुझे loadmat()विधि नहीं मिल रही है।

जवाबों:


517

एक आयात की आवश्यकता है, import scipy.io...

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

6
आधिकारिक SciPy.io ट्यूटोरियल: docs.scipy.org/doc/scipy/reference/tutorial/io.html
फ्रेंक डेर्नोनकोर्ट

18
scipy v7.3 mat-files का समर्थन नहीं करता (नोट यहाँ देखें )। समाधान के लिए विक्रांत द्वारा उत्तर देखें ।
तिकड़ी

हालाँकि, आप मैट-फाइल्स को पहले के संस्करणों के रूप में सहेज सकते हैं। देखें: mathworks.com/help/matlab/import_export/mat-file-versions.html (हेडर: 'सेव टू नॉनडफॉल्ट MAT-फाइल वर्जन')
watsonic

5
जैसेsave('myfile.mat','-v7')
वाटसन

149

न तो scipy.io.savemat, न ही scipy.io.loadmatMATLAB सरणियों संस्करण 7.3 के लिए काम करते हैं। लेकिन अच्छा हिस्सा यह है कि MATLAB संस्करण 7.3 फाइलें एचडीएफ 5 डेटासेट हैं। इसलिए उन्हें कई उपकरणों का उपयोग करके पढ़ा जा सकता है, जिसमें NumPy भी शामिल है ।

पायथन के लिए, आपको 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

6
यह ठीक काम करता है, यदि आप अपने डेटा को बचाते समय मतलब में '-v7.3' ध्वज का उपयोग करते हैं। डिफ़ॉल्ट save(कम से कम मतलाब आर २०४ बी में) का उपयोग करके एक फ़ाइल में परिणाम होता है जिसे उपरोक्त तकनीक का उपयोग करके नहीं पढ़ा जा सकता है। यदि आप '-v7.3' ध्वज का उपयोग करते हैं, तो संख्यात्मक डेटा को ठीक पढ़ा जा सकता है।
चिपाउडेट

3
हां, मैंने अपनी पोस्ट में यही कहा है। Matlab में बचत करते समय आपको -v7.3 का उपयोग करना होगा। आपको ऐसा करना चाहिए, क्योंकि यह बेहतर / अधिक समर्थित / मानकीकृत प्रारूप का उपयोग करता है।
विक्रांत

4
क्या आप बता सकते हैं कि आपके उदाहरण में f और डेटा के बीच क्या संबंध है ? मैं f को एक सुदूर सरणी में कैसे स्थानांतरित कर सकता हूं ?
हाराचो

इस कमांड से एक वेरिएबल को प्रॉम्प्ट से सहेजें:save('filename', '-v7.3', 'var1');
केविन काटज़के

23

सबसे पहले .mat फ़ाइल को इस प्रकार सहेजें:

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

उसके बाद, पायथन में, सामान्य loadmatफ़ंक्शन का उपयोग करें :

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

15

एक अच्छा पैकेज कहा जाता है mat4pyजिसे आसानी से उपयोग करके स्थापित किया जा सकता है

pip install mat4py

यह (वेबसाइट से) उपयोग करने के लिए सीधा है:

MAT-फ़ाइल से डेटा लोड करें

फ़ंक्शन loadmatकेवल पायथन में संग्रहीत सभी चर को एक साधारण पायथन डेटा संरचना में लोड करता है, केवल पायथन dictऔर listवस्तुओं का उपयोग करके । न्यूमेरिक और सेल सरणियों को पंक्ति-क्रमबद्ध नेस्टेड सूचियों में परिवर्तित किया जाता है। सरणियों को केवल एक तत्व के साथ सरणियों को खत्म करने के लिए निचोड़ा जाता है। परिणामी डेटा संरचना सरल प्रकार से बना है जो JSON प्रारूप के साथ संगत है ।

उदाहरण: एक पाय-फाइल को पायथन डेटा संरचना में लोड करें:

from mat4py import loadmat

data = loadmat('datafile.mat')

चर dataएक है dictचर और मानों मेट-फ़ाइल में निहित है।

एक MAT-फ़ाइल के लिए एक पायथन डेटा संरचना सहेजें

फ़ंक्शन के साथ पायथन डेटा को MAT-फ़ाइल में सहेजा जा सकता है savemat। डाटा के लिए के रूप में संरचना भी ऐसी ही हो गया है loadmat, यानी यह सरल डेटा प्रकार, जैसे से बना होना चाहिए dict, list, str, int, और float

उदाहरण: एक MAT-फ़ाइल के लिए एक पायथन डेटा संरचना सहेजें:

from mat4py import savemat

savemat('datafile.mat', data)

पैरामीटर dataएक होगा dictचर के साथ।


ध्यान दें कि mat4py आपको dicts, सूचियों, सूचियों की सूची में एक जोंस जैसा वृक्ष देता है ... - बिल्कुल भी खस्ता नहीं। ( mat4py/cmd.py my.matलिखते हैं my.json, 1 लंबी लाइन।)
डेनिस

1
@ हेडिस: हां, यह भी ऊपर कहा गया है। लेकिन वास्तव में एक अच्छी बात: मैं आमतौर पर इस संरचना को पसंद करता हूं, उदाहरण के लिए वेब अनुप्रयोगों में जैसे कि खस्ता सरणियां जेएसएन धारावाहिक नहीं हैं
क्लेब

एनकाउंटर किया गया:mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
s2t2

@ s2t2: पहले कभी इस मुद्दे पर नहीं चला। क्या matlab संस्करण और जो scipy संस्करण आप उपयोग कर रहे हैं?
क्लेब जूल

ParseError: अनपेक्षित क्षेत्र का नाम लंबाई: 43
UVs Fomins

13

MATLAB 2014 बी या नए स्थापित होने के बाद, पायथन के लिए MATLAB इंजन का उपयोग किया जा सकता है:

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

मुझे यह त्रुटि मिली: ModuleNotFoundError: 'pylab' नाम का कोई मॉड्यूल नहीं।
बारिश हो रही

3
इस उत्तर को आज़माते समय आपको त्रुटि मिली? यह अजीब है, यह पाइलैब का उपयोग नहीं करता है।
डैनियल

11

फ़ाइल पढ़ना

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

MAT चर के प्रकार का निरीक्षण करना

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

शब्दकोश के अंदर की चाबियाँ MATLAB चर हैं , और मान उन चर को दिए गए ऑब्जेक्ट हैं ।


7

MathWorks द्वारा पायथन के लिए MATLAB इंजन भी है। यदि आपके पास MATLAB है, तो यह विचार करने योग्य हो सकता है (मैंने इसे स्वयं नहीं आज़माया है, लेकिन इसमें केवल MATLAB फ़ाइलों को पढ़ने की तुलना में बहुत अधिक कार्यक्षमता है)। हालांकि, मुझे नहीं पता कि क्या इसे अन्य उपयोगकर्ताओं को वितरित करने की अनुमति है (यह शायद समस्या नहीं है यदि उन व्यक्तियों के पास MATLAB है। अन्यथा, शायद न्यूपीवाई जाने का सही तरीका है?)।

इसके अलावा, यदि आप सभी मूल बातें स्वयं करना चाहते हैं, तो MathWorks फ़ाइल प्रारूप की संरचना पर एक विस्तृत दस्तावेज प्रदान करता है (यदि लिंक बदलता है, तो matfile_format.pdfइसके लिए या इसके शीर्षक के लिए Google पर प्रयास करें MAT-FILE Format)। यह उतना जटिल नहीं है जितना मैंने व्यक्तिगत रूप से सोचा था, लेकिन जाहिर है, यह जाने का सबसे आसान तरीका नहीं है। यह इस बात पर भी निर्भर करता है कि .matआप किस तरह के -फाइल्स का समर्थन करना चाहते हैं।

मैंने एक "छोटी" (लगभग 700 पंक्तियाँ) पायथन लिपि लिखी है जो कुछ मूल-पाठ पढ़ सकती है .mat। मैं न तो पायथन विशेषज्ञ हूं और न ही शुरुआत करने वाला हूं और इसे लिखने के लिए मुझे लगभग दो दिन लग गए (ऊपर लिंक किए गए मैथवर्क्स प्रलेखन का उपयोग करके)। मैंने बहुत कुछ नया सीखा है और यह काफी मजेदार था (ज्यादातर समय)। जैसा कि मैंने काम पर पायथन स्क्रिप्ट लिखी है, मुझे डर है कि मैं इसे प्रकाशित नहीं कर सकता ... लेकिन मैं यहां कुछ सलाह दे सकता हूं:

  • पहले प्रलेखन पढ़ें।
  • एक हेक्स संपादक (जैसे एचएक्सडी ) का उपयोग करें और एक संदर्भ देखें-जिस पर .matआप पार्स करना चाहते हैं।
  • प्रत्येक बाइट का अर्थ जानने के लिए .txt फ़ाइल को बाइट्स सहेजकर और प्रत्येक पंक्ति को एनोटेट करके देखें।
  • प्रत्येक डेटा तत्व को बचाने के लिए कक्षाओं का प्रयोग करें (जैसे miCOMPRESSED, miMATRIX, mxDOUBLE, या miINT32)
  • .mat-Files 'संरचना एक पेड़ डेटा संरचना में डेटा तत्वों को बचाने के लिए इष्टतम है; प्रत्येक नोड में एक वर्ग और उप-नोड्स होते हैं

9
यह मैथवर्क्स द्वारा प्रदान किया गया किसी तरह से पागल प्रलेखन है। प्रारूप को समझाते हुए 40 पृष्ठ, यह उल्लेख किए बिना कि यह HDF5 का सबसेट है।
डैनियल

-1
from os.path import dirname, join as pjoin
import scipy.io as sio
data_dir = pjoin(dirname(sio.__file__), 'matlab', 'tests', 'data')
mat_fname = pjoin(data_dir, 'testdouble_7.4_GLNX86.mat')
mat_contents = sio.loadmat(mat_fname)

आप पायथन में डिफ़ॉल्ट सहेजी गई .mat फ़ाइल को पढ़ने के लिए उपरोक्त कोड का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.