2012-06-12 20 views
21

NumPy配列をMatlabに渡す方法を探しています。Numpy配列をMatlabに変換する(逆の場合)

scipy.misc.imsaveを使用して画像に配列を格納し、imreadを使用して配列をロードすることで、これを行うことができましたが、もちろん、実際の値ではなく0〜256の値が行列に含まれます。

この行列の積を256で割ったものと、元のNumPy配列の最大値を取ると正しい行列が得られますが、これはちょっと面倒です。

シンプルな方法はありますか?

+3

Matlabはテキストファイルを解析できますか?文字列でnumlab形式の配列をフォーマットするだけで、ファイルに書き込んだ後、配列をMatlabに読み込むことができます。 – JAB

+1

mlabwrapを検討しましたかhttp://mlabwrap.sourceforge.net/#description –

+2

numpy/scipyで計算を完全に行うことはできませんか?ちょっと疑問に思う – Bort

答えて

35

確かに、単なる例としてscipy.io.savemat

を使用します。

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)) 

同様に、scipy.io.loadmatがあります。

これをload testでmatlabに読み込みます。

@ JABでは、アスキータブ区切りのファイル(例:numpy.savetxt)に保存することもできます。ただし、このルートに行くと、2次元に制限されます。一方、asciiは普遍的な交換形式です。ほとんどすべてが区切られたテキストファイルを扱います。

+0

このようにnumpy配列をファイルに保存して、それを 'load( 'test.mat')'のようなものでmatlabに読み込ませることができますか? –

2

私は同じ問題に直面し、インタラクティブセッションからアレイを簡単にコピーして貼り付けるために次のスクリプトを書いていました。明らかに、わずかな配列のための実用的な、しかし、私は、ファイルを介して毎回/読み込みを節約するよりも、それはより便利が見つかりました:

Matlab -> Python

Python -> Matlab

4

scipy.io.savematまたはscipy.io.loadmatはありませんmatlabの配列のための仕事--v7.3。しかし、良いところは、matlab --v7.3ファイルはhdf5データセットであるということです。したがって、numpyを含む多くのツールを使用してそれらを読み取ることができます。

pythonの場合、h5py拡張が必要です(システムにはHDF5が必要です)。

6
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 

ファイルまたは外部LIBSによってデータを渡すことなく、簡単な解決策、。

Numpyにはndarraysをlistに変換するメソッドがあり、matlabのデータ型はリストから定義できます。だから、いつのように変換することができます:

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

より多くの注意が必要です。型を直接リストに変換する組み込み関数はありません。しかし、私たちは、生のデータにアクセスすることができます。したがって、reshape(正しくフォーマットする)とtranspose(MATLABとnumpyストアのデータが異なるため)を使用します。 ストレスを感じることは本当に重要です。主に2次元以上の行列を使用している場合は、プロジェクトでテストしてください。 MATLAB 2015aと2 dimsで動作します。

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

'mat_a = matlab.double(np_a.tolist())'はひどく非効率的/遅いことに注意してください。ジョーキングトンの答えは、np配列以外のものになります。 https://stackoverflow.com/a/45284125/2524427をご覧ください。 – 5Ke