12

私は現在、レガシーMatlabコード(Matlabエンジンを使用)で処理するいくつかのステップを実行し、残りをPython(numpy)で処理する必要があるプロジェクトに取り組んでいます。

matlab.mlarray.double結果を Matlabから numpyに変換するのが非常にnumpy.ndarray遅いことに気付きました。

別の ndarray、リスト、および mlarray から 1000 個の要素を持つ ndarray を作成するためのコード例を次に示します。

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 倍の時間がかかります。

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

4

2 に答える 2

15

質問を投稿した直後に解決策を見つけました。

1 次元配列の場合_data、Matlab 配列のプロパティのみにアクセスします。

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 次元配列の場合、これは次の呼び出しを意味します。

np.array(x._data).reshape(x.size[::-1]).T
于 2015-12-08T12:27:30.147 に答える