12

我目前正在做一个项目,我需要使用遗留的 Matlab 代码(使用 Matlab 引擎)和 Python(numpy)中的其余部分进行处理。

我注意到将结果从 Matlab 转换matlab.mlarray.double为 numpynumpy.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

发布问题后片刻,我找到了解决方案。

对于一维数组,只能访问_dataMatlab 数组的属性。

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
于 2015-12-08T12:27:30.147 回答
14

Tim 的回答非常适合 2D 数组,但使其适应 N 维数组的一种方法是使用ordernp.reshape() 的参数:

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

于 2016-09-07T22:42:36.913 回答