Có thể đọc tệp nhị phân MATLAB .mat trong Python không?
Tôi đã thấy rằng SciPy đã cáo buộc hỗ trợ để đọc các tệp .mat, nhưng tôi không thành công với nó. Tôi đã cài đặt SciPy phiên bản 0.7.0 và tôi không thể tìm thấy loadmat()
phương thức này.
Có thể đọc tệp nhị phân MATLAB .mat trong Python không?
Tôi đã thấy rằng SciPy đã cáo buộc hỗ trợ để đọc các tệp .mat, nhưng tôi không thành công với nó. Tôi đã cài đặt SciPy phiên bản 0.7.0 và tôi không thể tìm thấy loadmat()
phương thức này.
Câu trả lời:
Bắt buộc phải nhập, import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
save('myfile.mat','-v7')
Không scipy.io.savemat
, cũng không scipy.io.loadmat
hoạt động cho mảng MATLAB phiên bản 7.3. Nhưng phần tốt là các tệp MATLAB phiên bản 7.3 là bộ dữ liệu hdf5. Vì vậy, chúng có thể được đọc bằng một số công cụ, bao gồm NumPy .
Đối với Python, bạn sẽ cần h5py
phần mở rộng, yêu cầu HDF5 trên hệ thống của bạn.
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
(ít nhất là trong Matlab R2014b) dẫn đến một tệp không thể đọc được bằng cách sử dụng kỹ thuật trên. Nếu bạn sử dụng cờ '-v7.3', dữ liệu số có thể được đọc tốt.
save('filename', '-v7.3', 'var1');
Đầu tiên lưu tệp .mat dưới dạng:
save('test.mat', '-v7')
Sau đó, trong Python, sử dụng loadmat
hàm thông thường :
import scipy.io as sio
test = sio.loadmat('test.mat')
Có một gói đẹp được gọi là mat4py
có thể dễ dàng cài đặt bằng cách sử dụng
pip install mat4py
Nó rất đơn giản để sử dụng (từ trang web):
Tải dữ liệu từ tệp MAT
Hàm loadmat
tải tất cả các biến được lưu trữ trong tệp MAT vào cấu trúc dữ liệu Python đơn giản, chỉ sử dụng các đối tượng dict
và Python list
. Các mảng số và ô được chuyển đổi thành các danh sách lồng nhau theo thứ tự hàng. Mảng được ép để loại bỏ mảng chỉ với một phần tử. Cấu trúc dữ liệu kết quả bao gồm các loại đơn giản tương thích với định dạng JSON .
Ví dụ: Tải tệp MAT vào cấu trúc dữ liệu Python:
from mat4py import loadmat
data = loadmat('datafile.mat')
Biến data
là a dict
với các biến và giá trị có trong tệp MAT.
Lưu cấu trúc dữ liệu Python vào tệp MAT
Dữ liệu Python có thể được lưu vào tệp MAT, với chức năng savemat
. Dữ liệu phải được cấu trúc theo cách tương tự như đối với loadmat
, tức là nó phải được bao gồm các kiểu dữ liệu đơn giản, giống như dict
, list
, str
, int
, và float
.
Ví dụ: Lưu cấu trúc dữ liệu Python vào tệp MAT:
from mat4py import savemat
savemat('datafile.mat', data)
Tham số data
sẽ là a dict
với các biến.
mat4py/cmd.py my.mat
viết my.json
, 1 dòng dài.)
mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
Có MATLAB 2014b hoặc mới hơn được cài đặt, công cụ MATLAB cho Python có thể được sử dụng:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
Ngoài ra còn có MATLAB Engine cho Python bởi chính MathWorks. Nếu bạn có MATLAB, điều này có thể đáng để xem xét (tôi đã không tự mình thử nhưng nó có nhiều chức năng hơn là chỉ đọc các tệp MATLAB). Tuy nhiên, tôi không biết liệu có được phép phân phối nó cho những người dùng khác không (có lẽ không có vấn đề gì nếu những người đó có MATLAB. Nếu không, có lẽ NumPy là cách phù hợp?).
Ngoài ra, nếu bạn muốn tự mình thực hiện tất cả các điều cơ bản, MathWorks cung cấp (nếu liên kết thay đổi, hãy thử google matfile_format.pdf
hoặc tiêu đề của nó MAT-FILE Format
) một tài liệu chi tiết về cấu trúc của định dạng tệp. Nó không phức tạp như cá nhân tôi nghĩ, nhưng rõ ràng, đây không phải là cách dễ nhất để đi. Nó cũng phụ thuộc vào số lượng tính năng của .mat
-files bạn muốn hỗ trợ.
Tôi đã viết một tập lệnh Python "nhỏ" (khoảng 700 dòng) có thể đọc một số tệp cơ bản .mat
. Tôi không phải là chuyên gia Python cũng không phải là người mới bắt đầu và tôi mất khoảng hai ngày để viết nó (sử dụng tài liệu MathWorks được liên kết ở trên). Tôi đã học được rất nhiều thứ mới và nó khá thú vị (hầu hết thời gian). Khi tôi viết kịch bản Python tại nơi làm việc, tôi sợ rằng tôi không thể xuất bản nó ... Nhưng tôi có thể đưa ra một số lời khuyên ở đây:
.mat
bạn muốn phân tích cú pháp.miCOMPRESSED
, miMATRIX
, mxDOUBLE
, hay miINT32
).mat
cấu trúc -files' là tối ưu để tiết kiệm các yếu tố dữ liệu trong một cấu trúc dữ liệu cây; mỗi nút có một lớp và mã confrom 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)
Bạn có thể sử dụng mã ở trên để đọc tệp .mat được lưu mặc định trong Python.