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

标签 python matlab numpy type-conversion matlab-engine

我目前正在开展一个项目,我需要使用遗留 Matlab 代码(使用 Matlab 引擎)执行一些处理步骤,其余部分使用 Python (numpy)。

我注意到将结果从 Matlab 的 matlab.mlarray.double 转换为 numpy 的 numpy.ndarray 似乎非常慢。

下面是一些示例代码,用于创建一个 ndarray,其中包含来自另一个 ndarray、一个列表和一个 mlarray 的 1000 个元素:

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

关于python - 如何高效地将 Matlab 引擎数组转换为 numpy ndarray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34155829/

相关文章:

python - 用数据框的行值替换子列表中的第二项

python - 仅使用随机数的有趣任务

matlab - 使用不匹配的向量创建矩阵

python - 将功能应用于 Pandas 数据框中的组

python - 使用同一数据框中其他两列的值从一列创建二维列表

python - 用空格键中断计时器

python - Tensorflow 2 抛出 ValueError : as_list() is not defined on an unknown TensorShape

windows - 如何在 Matlab 中停止正在运行的脚本

regex - 如何使用 MATLAB 在元胞数组中同时替换多个子字符串

Python——sympysolve()返回另一个方程而不是值