如何高效地将Matlab引擎数组转换为numpy ndarray?

pftdvrlh  于 2022-12-04  发布在  Matlab
关注(0)|答案(2)|浏览(391)

我目前正在做一个项目,我需要做一些步骤的处理与遗留Matlab代码(使用Matlab引擎)和其余的Python(麻木)。
我注意到将结果从Matlab的matlab.mlarray.double转换为numpy的numpy.ndarray似乎非常慢。
以下是从另一个ndarray、list和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倍。
有什么办法可以加快转换速度吗?

o7jaxewo

o7jaxewo1#

在发布问题后的片刻,我找到了解决方案。
如果是一维数组,请只存取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

对于多维数组,您需要在之后重新调整数组的形状。对于二维数组,这意味着调用

np.array(x._data).reshape(x.size[::-1]).T
qc6wkl3g

qc6wkl3g2#

Tim的答案非常适合于二维数组,但要将其应用于N维数组,可以使用np.reshape()的order参数:
np_x = np.array(x._data).reshape(x.size, order='F')

相关问题