Python'daki .mat dosyalarını okuma


383

Python'da ikili MATLAB .mat dosyalarını okumak mümkün müdür?

SciPy'nin .mat dosyalarını okuma desteği olduğunu iddia ettim, ancak başarısız oldum. SciPy 0.7.0 sürümünü yükledim ve loadmat()yöntemi bulamıyorum .

Yanıtlar:


517

Bir ithalat gereklidir, import scipy.io...

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


18
scipy v7.3 mat dosyalarını desteklemez ( buradaki notlara bakın ). Çözüm için vikrantt'ın cevabına bakınız .
tekstil

ancak, mat dosyalarını önceki sürümler olarak kaydedebilirsiniz. bkz. mathworks.com/help/matlab/import_export/mat-file-versions.html (başlık: 'Varsayılan olmayan MAT Dosya Dosyasına Kaydet')
watsonic

5
ör.save('myfile.mat','-v7')
watsonic

149

Ne scipy.io.savemat, ne scipy.io.loadmatMATLAB diziler sürümü 7.3 için çalışır. Ancak iyi tarafı, MATLAB sürüm 7.3 dosyalarının hdf5 veri kümeleri olmasıdır. Böylece NumPy de dahil olmak üzere bir dizi araç kullanılarak okunabilirler .

Python için, h5pysisteminizde HDF5 gerektiren uzantıya ihtiyacınız olacak .

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
Verilerinizi kaydederken Matlab'daki '-v7.3' bayrağını kullanırsanız bu işe yarar. Varsayılanı kullanmak save(en azından Matlab R2014b'de), yukarıdaki teknik kullanılarak okunamayan bir dosyaya neden olur. '-V7.3' bayrağını kullanırsanız, sayısal veriler gayet iyi okunabilir.
chipaudette

3
Evet, yazımda söylediğim buydu. Matlab'a kaydederken -v7.3 kullanmanız gerekir. Bunu daha iyi / daha desteklenen / standart bir format kullandığından zaten yapmalısınız.
Vikrantt

4
Örneğinizde f ile veri arasındaki ilişkinin ne olduğunu açıklar mısınız? Nasıl taşıyabilirsiniz f bir numpy diziye?
heracho

Komut isteminden bu komutla bir değişken kaydedin:save('filename', '-v7.3', 'var1');
Kevin Katzke

23

Önce .mat dosyasını şu şekilde kaydedin:

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

Bundan sonra, Python'da normal loadmatişlevi kullanın :

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

15

mat4pyKullanarak kolayca kurulabilen güzel bir paket var

pip install mat4py

Kullanımı kolaydır (web sitesinden):

MAT dosyasından veri yükleme

İşlev loadmat, MAT dosyasında depolanan tüm değişkenleri yalnızca Python dictve listnesneleri kullanarak basit bir Python veri yapısına yükler . Sayısal ve hücre dizileri satır sıralı iç içe listelere dönüştürülür. Diziler, tek bir elemanla dizileri ortadan kaldırmak için sıkıştırılır. Ortaya çıkan veri yapısı, JSON formatıyla uyumlu basit türlerden oluşur .

Örnek: Python veri yapısına bir MAT dosyası yükleyin:

from mat4py import loadmat

data = loadmat('datafile.mat')

Değişken data, dictMAT dosyasında bulunan değişkenler ve değerlere sahip bir a'dır.

Python veri yapısını bir MAT dosyasına kaydetme

Python verileri işlevi ile bir MAT dosyasına kaydedilebilir savemat. Veriler için aynı şekilde yapılandırılmış olması gerekir loadmat, basit veri türleri gibi oluşmalıdır yani dict, list, str, int, ve float.

Örnek: Python veri yapısını bir MAT dosyasına kaydedin:

from mat4py import savemat

savemat('datafile.mat', data)

Parametre data, dictdeğişkenleri olan bir a olmalıdır .


Mat4py'nin size json benzeri bir dikte, liste, liste listesi ağacı verdiğini unutmayın ... - hiç numpy yok. ( mat4py/cmd.py my.matyazar my.json, 1 uzun satır.)
denis

1
@denis: Evet, yukarıda da belirtilmiş. Ama gerçekten iyi bir nokta: Genellikle bu yapıyı seviyorum, örneğin numpy dizileri gibi web uygulamalarında JSON serileştirilemez .
Cleb

Karşılaşma:mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
s2t2

@ s2t2: bu konuya daha önce hiç rastlamadım. Hangi matlab sürümünü ve hangi scipy sürümünü kullanıyorsunuz?
Cleb

ParseError: Beklenmeyen alan adı uzunluğu: 43
Aleksejs Fomins

13

MATLAB 2014b veya daha yenisi yüklü olduğunda, Python için MATLAB motoru kullanılabilir:

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

Bu hatayı aldım: ModuleNotFoundError: 'pylab' adında bir modül yok.
yağmur yağıyor

3
Bu cevapları denerken hatayla mı karşılaştınız? Bu tuhaf, pilab kullanmıyor.
Daniel

11

Dosyayı okuma

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

MAT değişkeninin türünün incelenmesi

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

Tuşları sözlüğe içerde MATLAB değişkenleri ve değerleri vardır bu değişkenlerin atanan nesneler .


7

MathWorks'ün kendisi tarafından Python için MATLAB Motoru da var . MATLAB varsa, bu dikkate değer olabilir (Ben kendim denemedim ama sadece MATLAB dosyalarını okumaktan çok daha fazla işlevselliğe sahiptir). Ancak, diğer kullanıcılara dağıtmasına izin verilip verilmediğini bilmiyorum (bu kişilerin MATLAB olması muhtemelen bir sorun değildir. Aksi takdirde, belki NumPy gitmek için doğru yoldur?).

Ayrıca, tüm temel bilgileri kendiniz yapmak istiyorsanız, MathWorks (bağlantı değişirse, google matfile_format.pdfveya başlığı için google'ı deneyin MAT-FILE Format) dosya biçiminin yapısı hakkında ayrıntılı bir dokümantasyon sağlar. Kişisel olarak düşündüğüm kadar karmaşık değil, ama açıkçası, bu en kolay yol değil. Ayrıca, .mat-dosyalarının kaç özelliğini desteklemek istediğinize de bağlıdır .

Bazı temel .matdosyaları okuyabilen bir "küçük" (yaklaşık 700 satır) Python betiği yazdım. Ne bir Python uzmanı ne de bir acemi değilim ve yazmak için yaklaşık iki gün sürdü (yukarıda bağlantılı MathWorks belgelerini kullanarak). Çok yeni şeyler öğrendim ve oldukça eğlenceliydi (çoğu zaman). Python senaryosunu iş yerinde yazdığım gibi, korkarım onu ​​yayınlayamıyorum ... Ama burada bazı tavsiyeler verebilirim:

  • Önce belgeleri okuyun.
  • Onaltılık bir düzenleyici ( HxD gibi ) kullanın ve .matayrıştırmak istediğiniz bir başvuru dosyasına bakın .
  • Baytları bir .txt dosyasına kaydederek ve her satıra açıklama ekleyerek her baytın anlamını anlamaya çalışın.
  • (Örneğin, her bir veri öğesi kaydetmek için sınıfları kullanarak miCOMPRESSED, miMATRIX, mxDOUBLEya da miINT32)
  • .mat-Dosyalar yapısı, bir ağaç veri yapısındaki veriler, elemanları kaydetmek için en uygun olduğu; her düğümün bir sınıfı ve alt düğümleri vardır

9
Mathworks tarafından sağlanan bir şekilde çılgın bir doküman. HDF5'in bir alt kümesi olduğundan bahsetmeden biçimi açıklayan 40 sayfa.
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)

Python'da varsayılan kaydedilmiş .mat dosyasını okumak için yukarıdaki kodu kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.