เป็นไปได้หรือไม่ที่จะอ่านไฟล์ไบนารี MATLAB .mat ใน Python
ฉันเคยเห็นว่า SciPy กล่าวหาว่าสนับสนุนการอ่านไฟล์. mat แต่ฉันไม่ประสบความสำเร็จ ฉันติดตั้ง SciPy เวอร์ชั่น 0.7.0 แล้วและฉันหาloadmat()
วิธีไม่พบ
เป็นไปได้หรือไม่ที่จะอ่านไฟล์ไบนารี MATLAB .mat ใน Python
ฉันเคยเห็นว่า SciPy กล่าวหาว่าสนับสนุนการอ่านไฟล์. mat แต่ฉันไม่ประสบความสำเร็จ ฉันติดตั้ง SciPy เวอร์ชั่น 0.7.0 แล้วและฉันหาloadmat()
วิธีไม่พบ
คำตอบ:
จำเป็นต้องนำเข้าimport scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
save('myfile.mat','-v7')
ค่าscipy.io.savemat
หรือscipy.io.loadmat
ทำงาน MATLAB เวอร์ชัน 7.3 อาร์เรย์ แต่ส่วนที่ดีคือไฟล์ MATLAB เวอร์ชั่น 7.3 เป็นชุดข้อมูล hdf5 ดังนั้นพวกเขาจึงสามารถอ่านได้โดยใช้หมายเลขของเครื่องมือรวมถึงNumPy
สำหรับ Python คุณจะต้องใช้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
save
(อย่างน้อยใน Matlab R2014b) ให้ผลลัพธ์เป็นไฟล์ที่ไม่สามารถอ่านได้โดยใช้เทคนิคด้านบน หากคุณใช้แฟล็ก '-v7.3' ข้อมูลตัวเลขสามารถอ่านได้อย่างดี
save('filename', '-v7.3', 'var1');
ก่อนอื่นให้บันทึกไฟล์. mat เป็น:
save('test.mat', '-v7')
หลังจากนั้นใน Python ให้ใช้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
savemat
ข้อมูลหลามจะสามารถบันทึกเป็นเสื่อไฟล์ที่มีฟังก์ชั่น ข้อมูลจะต้องมีโครงสร้างในลักษณะเช่นเดียวกับloadmat
คือมันควรจะประกอบด้วยชนิดข้อมูลง่ายเช่นdict
, list
, str
, และint
float
ตัวอย่าง: บันทึกโครงสร้างข้อมูล Python ไปยังไฟล์ MAT:
from mat4py import savemat
savemat('datafile.mat', data)
พารามิเตอร์data
จะต้องเป็นdict
กับตัวแปร
mat4py/cmd.py my.mat
เขียนmy.json
ยาว 1 บรรทัด)
mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
หากมีการติดตั้ง MATLAB 2014b หรือใหม่กว่าจะสามารถใช้โปรแกรม MATLAB สำหรับ Pythonได้:
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'>
คีย์ภายในพจนานุกรมเป็นตัวแปร MATLABและค่าเป็นวัตถุที่ได้รับมอบหมายให้ตัวแปรเหล่านั้น
นอกจากนี้ยังมีโปรแกรมMATLAB สำหรับ Pythonโดย MathWorks เอง หากคุณมี MATLAB นี่อาจเป็นสิ่งที่ควรพิจารณา (ฉันไม่ได้ลองด้วยตัวเอง แต่มันมีฟังก์ชันการทำงานมากกว่าการอ่านไฟล์ MATLAB) อย่างไรก็ตามฉันไม่ทราบว่าได้รับอนุญาตให้แจกจ่ายให้กับผู้ใช้รายอื่นหรือไม่ (อาจไม่ใช่ปัญหาหากบุคคลเหล่านั้นมี MATLAB มิฉะนั้น NumPy อาจเป็นวิธีที่ถูกต้องหรือไม่)
นอกจากนี้หากคุณต้องการทำพื้นฐานทั้งหมดด้วยตัวเองMathWorks ก็มีให้ (หากลิงก์เปลี่ยนไปให้ลอง googlematfile_format.pdf
หรือหรือชื่อMAT-FILE Format
) เอกสารรายละเอียดเกี่ยวกับโครงสร้างของรูปแบบไฟล์ มันไม่ซับซ้อนอย่างที่ฉันคิดเอง แต่เห็นได้ชัดว่านี่ไม่ใช่วิธีที่ง่ายที่สุดที่จะไป นอกจากนี้ยังขึ้นอยู่กับจำนวนฟีเจอร์ของ.mat
ไฟล์ที่คุณต้องการให้การสนับสนุน
ฉันได้เขียนสคริปต์ Python "ขนาดเล็ก" (ประมาณ 700 บรรทัด) ซึ่งสามารถอ่านพื้นฐานได้ .mat
ได้ ฉันไม่ใช่ผู้เชี่ยวชาญของ Python และมือใหม่และใช้เวลาประมาณสองวันในการเขียน (ใช้เอกสาร MathWorks ที่ลิงก์ด้านบน) ฉันได้เรียนรู้สิ่งใหม่ ๆ มากมายและสนุกมาก (เกือบตลอดเวลา) ขณะที่ฉันเขียนสคริปต์ Python ในที่ทำงานฉันกลัวว่าฉันจะไม่เผยแพร่ ... แต่ฉันสามารถให้คำแนะนำได้ที่นี่:
.mat
คุณต้องการแยกวิเคราะห์miCOMPRESSED
, miMATRIX
, mxDOUBLE
หรือmiINT32
).mat
โครงสร้าง -Files' เป็นที่เหมาะสมสำหรับการประหยัดองค์ประกอบข้อมูลในโครงสร้างข้อมูลต้นไม้ แต่ละโหนดมีหนึ่งคลาสและโหนดย่อย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 ที่บันทึกเป็นค่าเริ่มต้นใน Python