我目前正在开发一个项目,我需要使用传统的Matlab代码(使用Matlab引擎)进行一些处理,其余的则使用Python(numpy).
我注意到将Matlab的结果转换matlab.mlarray.double
为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倍.
有没有办法加快转换?
发布问题后的时刻我找到了解决方案.
对于一维数组,只能访问_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
对于多维数组,您需要在之后重新整形数组.在二维数组的情况下,这意味着调用
np.array(x._data).reshape(x.size[::-1]).T
Tim的答案非常适合2D数组,但是将其调整为N维数组的方法是使用order
np.reshape()的参数:
np_x = np.array(x._data).reshape(x.size, order='F')