Baca file .mat dengan Python

383

Apakah mungkin untuk membaca file .LAT .Lmat biner dengan Python?

Saya telah melihat bahwa SciPy telah menuduh dukungan untuk membaca file .mat, tapi saya tidak berhasil. Saya menginstal SciPy versi 0.7.0, dan saya tidak dapat menemukan loadmat()metode ini.

Gilad Naor
sumber

Jawaban:

517

Diperlukan impor, import scipy.io...

import scipy.io
mat = scipy.io.loadmat('file.mat')
Gilad Naor
sumber
6
Tutorial resmi SciPy.io: docs.scipy.org/doc/scipy/reference/tutorial/io.html
Franck Dernoncourt
18
Scipy tidak mendukung file-file v7.3 mat (lihat catatan di sini ). Lihat jawabannya oleh vikrantt untuk solusinya.
texnic
Namun, Anda dapat menyimpan file-mat sebagai versi sebelumnya. lihat: mathworks.com/help/matlab/import_export/mat-file-versions.html (header: 'Simpan ke Nondefault MAT-File Version')
watsonic
5
mis.save('myfile.mat','-v7')
watsonic
150

Baik scipy.io.savemat, atau scipy.io.loadmatberfungsi untuk array MATLAB versi 7.3. Tetapi bagian baiknya adalah bahwa file MATLAB versi 7.3 adalah dataset hdf5. Sehingga mereka dapat dibaca menggunakan sejumlah alat, termasuk NumPy .

Untuk Python, Anda memerlukan h5pyekstensi, yang membutuhkan HDF5 di sistem Anda.

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
vikrantt
sumber
6
Ini berfungsi dengan baik, jika Anda menggunakan flag '-v7.3' di Matlab saat menyimpan data Anda. Menggunakan default save(setidaknya dalam Matlab R2014b) menghasilkan file yang tidak dapat dibaca menggunakan teknik di atas. Jika Anda menggunakan flag '-v7.3', data numerik dapat dibaca dengan baik.
chipaudette
3
Ya, itulah yang saya katakan di posting saya. Anda perlu menggunakan -v7.3 saat menyimpan di Matlab. Anda harus melakukannya karena menggunakan format yang lebih baik / lebih didukung / terstandarisasi.
vikrantt
4
Bisakah Anda jelaskan apa hubungan antara f dan data dalam contoh Anda? Bagaimana saya bisa memindahkan f ke array numpy?
heracho
Simpan variabel dengan perintah ini dari prompt:save('filename', '-v7.3', 'var1');
Kevin Katzke
23

Pertama-tama simpan file .mat sebagai:

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

Setelah itu, dengan Python, gunakan loadmatfungsi yang biasa :

import scipy.io as sio
test = sio.loadmat('test.mat')
Bhanu Pratap Singh
sumber
15

Ada paket bagus yang disebut mat4pyyang dapat dengan mudah diinstal menggunakan

pip install mat4py

Mudah digunakan (dari situs web):

Memuat data dari file MAT

Fungsi loadmatmemuat semua variabel yang disimpan dalam file-MAT ke dalam struktur data Python sederhana, hanya menggunakan Python dictdan listobjek. Numerik dan susunan sel dikonversi ke daftar bersarang urutan-urutan. Array diperas untuk menghilangkan array dengan hanya satu elemen. Struktur data yang dihasilkan terdiri dari tipe sederhana yang kompatibel dengan format JSON .

Contoh: Memuat file-MAT ke dalam struktur data Python:

from mat4py import loadmat

data = loadmat('datafile.mat')

Variabel dataadalah dictdengan variabel dan nilai-nilai yang terkandung dalam file-MAT.

Menyimpan struktur data Python ke file MAT

Data python dapat disimpan ke file-MAT, dengan fungsi savemat. Data harus terstruktur dengan cara yang sama seperti untuk loadmat, yaitu harus terdiri dari tipe data sederhana, seperti dict, list, str, int, dan float.

Contoh: Simpan struktur data Python ke file MAT:

from mat4py import savemat

savemat('datafile.mat', data)

Parameter dataharus dictdengan variabel.

Cleb
sumber
Perhatikan bahwa mat4py memberi Anda pohon dicts json seperti, daftar, daftar daftar ... - tidak ada numpy sama sekali. ( mat4py/cmd.py my.matmenulis my.json, 1 baris panjang).
denis
1
@denis: Ya, itu juga disebutkan di atas. Tapi poin yang bagus memang: Saya biasanya suka struktur ini, misalnya dalam aplikasi web sebagai array numpy tidak JSON serializable .
Cleb
Ditemui:mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
s2t2
@ s2t2: tidak pernah mengalami masalah ini sebelumnya. Apa versi matlab dan versi scipy apa yang Anda gunakan?
Cleb
ParseError: Panjang nama bidang tidak terduga: 43
Aleksejs Fomins
13

Memiliki MATLAB 2014b atau yang lebih baru diinstal, mesin MATLAB untuk Python dapat digunakan:

import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
Daniel
sumber
Saya mendapat kesalahan ini: ModuleNotFoundError: Tidak ada modul bernama 'pylab'.
Hujan
3
Anda mendapat kesalahan saat mencoba jawaban ini? Itu aneh, tidak menggunakan pylab.
Daniel
11

Membaca file

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

Memeriksa jenis variabel MAT

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

The kunci dalam kamus yang variabel MATLAB , dan nilai-nilai adalah obyek ditugaskan untuk variabel-variabel .

Daksh
sumber
7

Ada juga MATLAB Engine untuk Python oleh MathWorks sendiri. Jika Anda memiliki MATLAB, ini mungkin perlu dipertimbangkan (saya belum mencobanya sendiri tetapi memiliki lebih banyak fungsi daripada hanya membaca file MATLAB). Namun, saya tidak tahu apakah diizinkan untuk mendistribusikannya ke pengguna lain (mungkin tidak masalah jika orang-orang tersebut memiliki MATLAB. Jika tidak, mungkin NumPy adalah cara yang tepat untuk pergi?).

Selain itu, jika Anda ingin melakukan sendiri semua dasar-dasarnya, MathWorks memberikan (jika tautannya berubah, coba ke Google untuk matfile_format.pdfatau judulnya MAT-FILE Format) dokumentasi terperinci tentang struktur format file. Ini tidak serumit yang saya pikirkan secara pribadi, tetapi jelas, ini bukan cara termudah untuk pergi. Itu juga tergantung pada berapa banyak fitur .mat-file yang ingin Anda dukung.

Saya telah menulis skrip Python "kecil" (sekitar 700 baris) yang dapat membaca beberapa .matfile dasar . Saya bukan ahli Python atau pemula dan butuh sekitar dua hari untuk menulisnya (menggunakan dokumentasi MathWorks yang ditautkan di atas). Saya telah belajar banyak hal baru dan itu cukup menyenangkan (sebagian besar waktu). Karena saya sudah menulis skrip Python di tempat kerja, saya khawatir saya tidak dapat mempublikasikannya ... Tetapi saya dapat memberikan beberapa saran di sini:

  • Pertama baca dokumentasi.
  • Gunakan hex editor (seperti HxD ) dan lihat referensi .mat-file yang ingin Anda uraikan.
  • Cobalah untuk mencari tahu arti setiap byte dengan menyimpan byte ke file .txt dan anotasi setiap baris.
  • Menggunakan kelas untuk menyimpan setiap elemen data (seperti miCOMPRESSED, miMATRIX, mxDOUBLE, atau miINT32)
  • Struktur .mat-file optimal untuk menyimpan elemen data dalam struktur data pohon; setiap node memiliki satu kelas dan subnode
mozzbozz
sumber
9
Entah bagaimana itu dokumentasi gila yang disediakan oleh matematika. 40 halaman menjelaskan format, tanpa menyebutkan bahwa itu adalah bagian dari HDF5.
Daniel
-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)

Anda dapat menggunakan kode di atas untuk membaca file .mat default yang disimpan dalam Python.

Sameer Gadekar
sumber