2009-05-17 42 views
234

Có ai có kinh nghiệm thành công khi đọc tệp nhị phân Matlab .mat trong Python không?Đọc các tệp .mat trong Python

(I have seen that scipy đã bị cáo buộc hỗ trợ cho việc đọc .mat file, 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 ra phương pháp loadmat())

Trả lời

339

Tôi ngớ ngẩn quá. Quên để nhập io ...

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

Hướng dẫn chính thức của SciPy.io: http://docs.scipy.org/doc/scipy/reference/tutorial/io.html –

+13

scipy không hỗ trợ tệp mat v7.3 (xem ghi chú [tại đây] (http : //docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.io.loadmat.html)). Xem [answer by vikrantt] (http://stackoverflow.com/a/19340117/674976) để biết giải pháp. Tuy nhiên, – texnic

+0

, bạn có thể lưu các tệp mat như các phiên bản trước đó. xem: http://www.mathworks.com/help/matlab/import_export/mat-file-versions.html (tiêu đề: 'Lưu vào Phiên bản Tệp Phiên bản Không Định trước') – watsonic

92

Cả scipy.io.savemat, cũng không scipy.io.loadmat làm việc cho mảng matlab --v7.3. Nhưng phần tốt là các tập tin MATLAB - v7.3 là bộ dữ liệu hdf5. Vì vậy, họ có thể được đọc bằng cách sử dụng một số công cụ, bao gồm cả gumpy.

Đối với trăn, bạn sẽ cần phần mở rộng h5py, 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 numpy array 
+3

Điều này làm việc tốt, nếu bạn sử dụng cờ '-v7.3' trong Matlab khi lưu dữ liệu của bạn. Sử dụng 'save' mặc định (ít nhất là trong Matlab R2014b) sẽ dẫn đến một tệp không thể đọc được bằ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. – chipaudette

+2

Vâng, đó là những gì tôi đã nói trong bài viết của tôi. Bạn cần phải sử dụng -v7.3 trong khi lưu trong Matlab. Bạn nên làm điều đó dù sao vì nó sử dụng một định dạng tốt hơn/được hỗ trợ/chuẩn hóa hơn. – vikrantt

+2

Bạn có thể giải thích mối quan hệ giữa _f_ và _data_ trong ví dụ của bạn không? Làm thế nào tôi có thể di chuyển _f_ đến một mảng numpy? – heracho

4

Ngoài ra còn có MATLAB Engine for Python bởi MathWorks. Nếu bạn có Matlab, điều này có thể đáng xem xét (tôi đã không thử nó bản thân mình nhưng nó có nhiều chức năng hơn là chỉ đọc các tập tin Matlab). Tuy nhiên, tôi không biết nếu nó được phép phân phối nó cho người dùng khác (có lẽ không có vấn đề nếu những người có Matlab, nếu không có lẽ NumPy là đúng cách để đi?).

Ngoài ra, nếu bạn muốn tự mình làm tất cả những điều cơ bản, MathWorks provides (nếu liên kết thay đổi, hãy thử google cho matfile_format.pdf hoặc tiêu đề MAT-FILE Format) 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ư 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, có bao nhiêu 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ố số cơ bản .mat -files. Tôi không phải là một chuyên gia về 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ị (phần lớn thời gian). Như tôi đã viết kịch bản Python tại nơi làm việc, tôi sợ tôi không thể xuất bản nó ... Nhưng tôi có thể đưa ra một vài lời khuyên ở đây:

  • Đầu đọc tài liệu
  • Sử dụng một HEX-Editor (như HxD) và nhìn vào một tài liệu tham khảo .mat -file bạn muốn phân tích
  • Cố gắng tìm ra ý nghĩa của từng Byte bằng cách tiết kiệm các Bytes đến một txt file và chú thích mỗi dòng
  • Sử dụng các lớp học để tiết kiệm mỗi dữ liệu phần tử (chẳng hạn như miCOMPRESSED, miMATRIX, mxDOUBLE hoặc miINT32)
  • Cấu trúc .mat -files 'tối ưu để lưu các phần tử dữ liệu trong cấu trúc dữ liệu cây; mỗi nút có một lớp và subnodes
+7

Đó là một tài liệu điên rồ nào đó được cung cấp bởi mathworks. 40 trang giải thích định dạng, mà không đề cập rằng nó là một tập con của HDF5. – Daniel

+0

là mã của bạn trên github ở bất cứ đâu? – ErroriSalvo

+1

@ErroriSalvo Không, xin lỗi. Tôi đã làm điều này tại nơi làm việc, không phải lúc rảnh rỗi, vì vậy tôi không thể chia sẻ mã. Ngoài ra không bao giờ thực sự đánh bóng nó, là một bằng chứng-of-khái niệm. – mozzbozz

6

Có Matlab 2014b hoặc mới hơn được cài đặt, Matlab engine for Python có thể được sử dụng:

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

Tôi đã hơi say nửa giờ ngay cả sau khi đọc câu trả lời. Hy vọng câu trả lời này giúp

Đầu tiên lưu các tập tin mat như

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

Sau đó bằng Python sử dụng loadmat thường

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

Đọc file

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

Insecting loại mat ble

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

Các phím bên trong từ điển có biến matlabgiá trị là những đối tượng được gán cho các biến.

Các vấn đề liên quan