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 .
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:
Bir ithalat gereklidir, import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
save('myfile.mat','-v7')
Ne scipy.io.savemat
, ne scipy.io.loadmat
MATLAB 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, h5py
sisteminizde 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
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.
save('filename', '-v7.3', 'var1');
Önce .mat dosyasını şu şekilde kaydedin:
save('test.mat', '-v7')
Bundan sonra, Python'da normal loadmat
işlevi kullanın :
import scipy.io as sio
test = sio.loadmat('test.mat')
mat4py
Kullanarak 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 dict
ve list
nesneleri 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
, dict
MAT 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
, dict
değişkenleri olan bir a olmalıdır .
mat4py/cmd.py my.mat
yazar my.json
, 1 uzun satır.)
mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
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)
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.pdf
veya 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 .mat
dosyaları 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:
.mat
ayrıştırmak istediğiniz bir başvuru dosyasına bakın .miCOMPRESSED
, miMATRIX
, mxDOUBLE
ya 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ırfrom 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.