web-dev-qa-db-ja.com

Numpy配列をMatlabに「変換」、またはその逆

NumPy配列をMatlabに渡す方法を探しています。

scipy.misc.imsaveを使用して配列をイメージに保存し、imreadを使用してロードすることでこれを実行できましたが、これによりもちろん、マトリックスの値が '実際の値。

この行列の積を256で除算し、元のNumPy配列の最大値から正しい行列が得られますが、これは少し面倒だと感じています。

もっと簡単な方法はありますか?

32
user1444165

確かに、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

次に、これをmatlabにload test

あるいは、@ JABが示唆したように、ASCIIタブ区切りファイル(例:numpy.savetxt)。ただし、このルートを使用すると、2次元に制限されます。一方、asciiはユニバーサル交換形式です。ほとんどすべてが区切りテキストファイルを処理します。

44
Joe Kington

ファイルまたは外部ライブラリによってデータを渡すことのない単純なソリューション。

Numpyには、ndarrayをリストに変換するメソッドがあり、リストからmatlabデータ型を定義できます。したがって、次のように変換できる場合:

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

Matlabからpythonにはさらに注意が必要です。型をリストに直接変換する組み込み関数はありません。しかし、整形されていないプレーンな生データにアクセスできます。 、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()
9
Juliano ENS

しばらく前、私は同じ問題に直面し、対話型セッションから前後に配列を簡単にコピーおよび貼り付けできるように、次のスクリプトを作成しました。明らかに小さな配列に対してのみ実用的ですが、毎回ファイルを介して保存/ロードするよりも便利です:

Matlab-> Python

Python-> Matlab

4
robince

scipy.io.savematまたはscipy.io.loadmatは、Matlabアレイ--v7.3では機能しません。しかし、良い点は、matlab --v7.3ファイルがhdf5データセットであることです。そのため、numpyを含む多くのツールを使用して読むことができます。

Pythonの場合、システムで HDF5 を必要とする h5py 拡張が必要です。

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
vikrantt

「シンプル」としてカウントされるかどうかはわかりませんが、matlabによって非常に高速に呼び出されるpythonスクリプトで作成されたnumpy配列からデータを移動する解決策を見つけました。

dump_reader.py(pythonソース):

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スクリプト):

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 doubleは、セル/行列と比較して、アレイで効率的に機能しているように見えるという事実に依存しています。 2番目のトリックは、データをmatlabs doubleに効率的な方法で渡すことです(pythons native array.arrayを使用)。

追伸ネクロポスティングで申し訳ありませんが、私はそれで多くのことに苦労しました、そして、このトピックは最も近いヒットの1つでした。たぶんそれは誰かが苦労の時間を短縮するのに役立ちます。

P.P.S. Matlab R2016b + python 3.5.4(64bit)でテスト済み

1
Christian B.