2015-12-08 29 views
7

私は現在、従来のMatlabコード(Matlabエンジンを使用)とPython(numpy)の残りの部分で処理するいくつかのステップを行う必要があるプロジェクトに取り組んでいます。Matlabエンジンアレイをnumpy ndarrayに効率的に変換する方法は?

Matlabのmatlab.mlarray.doubleの結果をnumpyのnumpy.ndarrayに変換するのが非常に遅いようです。ここで

は別のndarrayから1000個の要素でndarrayを作成するためのいくつかの例のコードは、リストとmlarrayです:

import timeit 
setup_range = ("import numpy as np\n" 
       "x = range(1000)") 
setup_arange = ("import numpy as np\n" 
       "x = np.arange(1000)") 
setup_matlab = ("import numpy as np\n" 
       "import matlab.engine\n" 
       "eng = matlab.engine.start_matlab()\n" 
       "x = eng.linspace(0., 1000.-1., 1000.)") 
print 'From other array' 
print timeit.timeit('np.array(x)', setup=setup_arange, number=1000) 
print 'From list' 
print timeit.timeit('np.array(x)', setup=setup_range, number=1000) 
print 'From matlab' 
print timeit.timeit('np.array(x)', setup=setup_matlab, number=1000) 

次の時間をとる:

From other array 
0.00150722111994 
From list 
0.0705359556928 
From matlab 
7.0873282467 

変換を約かかりますリストからの変換の100倍。

変換を高速化する方法はありますか?

答えて

9

質問を投稿した後、解決策が見つかりました。

1次元配列の場合、Matlab配列の_dataプロパティにのみアクセスします。あなたはその後、アレイを再構築する必要が多次元配列の場合

import timeit 
print 'From list' 
print timeit.timeit('np.array(x)', setup=setup_range, number=1000) 
print 'From matlab' 
print timeit.timeit('np.array(x)', setup=setup_matlab, number=1000) 
print 'From matlab_data' 
print timeit.timeit('np.array(x._data)', setup=setup_matlab, number=1000) 

プリント

From list 
0.0719847538787 
From matlab 
7.12802865169 
From matlab_data 
0.118476275533 

:2次元配列の場合、これは)(ティムの答えは、2Dアレイのための素晴らしいですが、N次元配列に適合させるための方法がnp.reshapeの orderパラメータを使用することです
6

np.array(x._data).reshape(x.size[::-1]).T 
を呼び出すことを意味し

np_x = np.array(x._data).reshape(x.size, order='F')

関連する問題