Soru Numpy dizilerini Matlab'a dönüştürme ve tersi


Numypy dizilerini Matlab'a iletmenin bir yolunu arıyorum.

Diziyi kullanarak bir görüntüyü saklayarak bunu yapmayı başardım scipy.misc.imsave ve sonra onu kullanarak yükleme imreadama bu tabii ki matrisin 'gerçek' değerler yerine 0 ve 256 arasında değerler içermesine neden olur.

Bu matrisin ürününü 256'ya bölerek ve orijinal NumPy dizisindeki maksimum değer bana doğru matrisi verir, ama bunun biraz sıkıcı olduğunu hissediyorum.

daha basit bir yolu var mı?


25
2018-06-12 13:02


Menşei


Unutma, Matlab metin dosyalarını ayrıştırmaya izin veriyor mu? Nümerik dizileri dizelerdeki Matlab stili olanlar olarak biçimlendirebildiğinizden, bunları bir dosyaya yazabilir ve ardından dizileri Matlab'a okuyabilirsiniz. - JAB
Mandrel'i düşündün mü? mlabwrap.sourceforge.net/#description - dilip kumbham
Hesaplamayı tamamen numpy / scipy'de yapamayacağına emin misin? sadece merak ediyorum - Bort
Bir PLSM algoritmasının Matlab uygulamasını numpy'ye dönüştürebileceğime eminim, fakat bir-bir-olmayanların neden olduğu tüm problemleri çözmek ve fonksiyonlardaki farklılık çok zaman alıcıdır. Öneri @JAB için teşekkürler, ilk önce bir görüntüye dönüştürmekten daha az sıkıcıdır. Ancak, daha sonra 3D matrislerle karşılaşabilirim, bu yüzden Joe'nun çözümü benim için çalışıyor.
MATLAB HDF5 formatını okuyabilir ve yazabilir, python kütüphaneleri vardır. .. - Memming


Cevaplar:


Tabii, sadece kullan scipy.io.savemat

Örnek olarak:

import numpy as np
import scipy.io

x = np.linspace(0, 2 * np.pi, 100)
y = np.cos(x)

scipy.io.savemat('test.mat', dict(x=x, y=y))

Benzer şekilde, orada scipy.io.loadmat.

Sonra bunu matlab ile yüklersiniz load test.

JAB önerdiği gibi, alteratif olarak, yalnızca bir ascii sekmesi ile sınırlandırılmış dosyaya (ör. numpy.savetxt). Ancak, bu rotaya giderseniz 2 boyut ile sınırlı olacaksınız. Öte yandan, ascii evrensel değişim formatıdır. Hemen hemen her şey sınırlandırılmış bir metin dosyasını ele alacaktır.


39
2018-06-12 13:07



bu sayede bir dosyaya bir numpy dizisini kaydetmeyi ve daha sonra matlab tarafından okunabilecek load('test.mat')? - Charlie Parker


Dosya veya harici kütüphaneler tarafından veri aktarılmadan basit bir çözüm.

Numpy ndarray'ları listeye dönüştürmek için bir yönteme sahiptir ve matlab veri türleri listelerden tanımlanabilir. Yani, ne zaman dönüşebilir:

np_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
mat_a = matlab.double(np_a.tolist())

Matlab'dan python'a daha fazla ilgi gerektirir. Türü doğrudan listelere dönüştürmek için yerleşik bir işlev yoktur. Ama şekillendirilmemiş, ancak ham olan ham verilere erişebiliriz. Yani kullanıyoruz reshape (doğru formatlamak için) ve transpose (MATLAB ve numpy depo verileri farklı şekilde). Stres yapmak gerçekten çok önemli: Projenizde, çoğunlukla 2'den fazla boyutta matris kullanıyorsanız, bunu test edin. MATLAB 2015a ve 2 dim için çalışıyor.

np_a = np.array(mat_a._data.tolist())
np_a = np_a.reshape(mat_a.size).transpose()

7
2018-05-27 19:35



Bunu not et mat_a = matlab.double(np_a.tolist()) korkunç verimsiz / yavaş olabilir. Joe Kington'un np dizilerinden başka bir şey için cevabıyla git. Görmek stackoverflow.com/a/45284125/2524427 - 5Ke


scipy.io.savemat veya scipy.io.loadmat matlab dizileri için çalışmaz --v7.3. Ancak iyi olan, matlab --v7.3 dosyalarının hdf5 veri kümeleri olmasıdır. Bu nedenle, numpy dahil olmak üzere bir dizi araç kullanarak okunabilirler.

Python için ihtiyacınız olacak h5py uzantısı, gerektirir HDF5 sisteminizde.

import numpy as np, h5py 
f = h5py.File('somefile.mat','r') 
data = f.get('data/variable1') 
data = np.array(data) # For converting to numpy array

4
2017-10-12 00:25





Bir süre önce aynı problemle yüz yüze geldim ve interaktif oturumlardan geriye ve ileriye doğru dizilerin kolayca kopyalanmasına ve yapıştırılmasına izin vermek için aşağıdaki komut dosyalarını yazdım. Açıkçası sadece küçük diziler için pratik, ancak her seferinde bir dosyadan kaydetme / yükleme işleminden daha kullanışlı buldum:

Matlab -> Python

Python -> Matlab


2
2018-06-13 11:28





"Daha basit" olarak sayılırsa emin değilim, ancak matlab tarafından oldukça hızlı bir şekilde çağrılan bir python betiğinde oluşturulan bir sayı dizisinden veri taşımak için bir çözüm buldum:

dump_reader.py (python kaynağı):

import numpy

def matlab_test2():
    np_a    = numpy.random.uniform(low = 0.0, high = 30000.0, size = (1000,1000))
    return np_a

dump_read.m (matlab komut dosyası):

clear classes
mod = py.importlib.import_module('dump_reader');
py.importlib.reload(mod);

if count(py.sys.path,'') == 0
    insert(py.sys.path,int32(0),'');
end

tic
A = py.dump_reader.matlab_test2();
toc
shape = cellfun(@int64,cell(A.shape));
ls = py.array.array('d',A.flatten('F').tolist());
p = double(ls);
toc
C = reshape(p,shape);
toc

Matlabs çiftinin hücrelere / matrislere kıyasla dizilerde verimli çalıştığı gerçeğine dayanır. İkinci ipucu, verileri matlabs çiftine verimli bir şekilde (pythons native array.array) aktarmaktır.

Not; Necroposting için özür dilerim ama onunla çok uğraştım ve bu konu en yakın hitlerden biriydi. Belki de birilerinin mücadele zamanını kısaltmasına yardımcı olur.

P.P.S. Matlab R2016b + python 3.5.4 ile test edildi (64bit)


0
2018-04-06 22:55