如何高效地将 Matlab 引擎数组转换为 numpy ndarray?
How to efficiently convert Matlab engine arrays to numpy ndarray?
我目前正在做一个项目,我需要用遗留的 Matlab 代码(使用 Matlab 引擎)做一些处理步骤,其余的在 Python (numpy) 中。
我注意到将结果从 Matlab 的 matlab.mlarray.double
转换为 numpy 的 numpy.ndarray
似乎非常慢。
下面是一些示例代码,用于创建一个 ndarray,其中包含来自另一个 ndarray 的 1000 个元素、一个列表和一个 mlarray:
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数组的_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 的答案非常适合二维数组,但使其适应 N 维数组的一种方法是使用 np.reshape() 的 order
参数:
np_x = np.array(x._data).reshape(x.size, order='F')
我目前正在做一个项目,我需要用遗留的 Matlab 代码(使用 Matlab 引擎)做一些处理步骤,其余的在 Python (numpy) 中。
我注意到将结果从 Matlab 的 matlab.mlarray.double
转换为 numpy 的 numpy.ndarray
似乎非常慢。
下面是一些示例代码,用于创建一个 ndarray,其中包含来自另一个 ndarray 的 1000 个元素、一个列表和一个 mlarray:
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数组的_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 的答案非常适合二维数组,但使其适应 N 维数组的一种方法是使用 np.reshape() 的 order
参数:
np_x = np.array(x._data).reshape(x.size, order='F')