Python 如何有效地将Matlab引擎阵列转换为numpy ndarray?

Python 如何有效地将Matlab引擎阵列转换为numpy ndarray?,python,matlab,numpy,type-conversion,matlab-engine,Python,Matlab,Numpy,Type Conversion,Matlab Engine,我目前正在从事一个项目,我需要使用遗留的Matlab代码(使用Matlab引擎)和Python(numpy)完成一些处理步骤 我注意到,将Matlab的Matlab.mlarray.double的结果转换为numpy的numpy.ndarray似乎非常慢 下面是一些示例代码,用于从另一个ndarray、列表和mlarray创建一个包含1000个元素的ndarray: import timeit setup_range = ("import numpy as np\n"

我目前正在从事一个项目,我需要使用遗留的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倍


有没有办法加快转换速度?

在发布问题后,我找到了解决方案

对于一维数组,仅访问Matlab数组的
\u 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

Tim的答案适用于2D数组,但将其应用于N维数组的一种方法是使用np.reformate()的
order
参数:


np\ux=np.array(x.\u data).重塑(x.size,order='F')

RobR的答案更一般,看看它的N(>2)维数组我认为这应该是
np\ux=np.array(x.\u data).重塑(x.size,order='F').T
,如果数据很复杂,那么就使用“实”和“imag”属性(而不是“数据”)