当前位置: 首页 > 面试题库 >

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

壤驷涛
2023-03-14
问题内容

我目前在一个项目中,需要执行一些步骤,以处理旧版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倍。

有什么办法可以加快转换速度吗?


问题答案:

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

对于一维数组,仅访问_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


 类似资料:
  • 所以我试图生成一个数组,其中填充了唯一的随机整数,我发现用arraylist来实现这一点是最有效的方法。 现在我试着使用但我不太确定括号里应该放什么,也不确定这是否真的能起作用。有没有其他转换方法,因为我不能简单地通过。

  • 问题内容: 我具有以下功能,可以将PDF转换为一系列图像(每页一个图像): 这可以很好地工作,性能并没有那么快,但这并不重要。我的问题与内存消耗有关。假设我要转换一个较长的PDF(Apple的10-Q,长达51页): 到最后一页的末尾,内存使用量一直增加到〜11GB! 我还注意到一些注意事项: 当我通过Instruments运行此程序时,它出乎意料地显示没有泄漏。两个大记忆猪是和。它们似乎没有在两

  • 给定一个由整数和一个数字组成的数组,,对该数组执行左旋转。然后将更新后的数组打印为单行空格分隔的整数。 示例输入: 如何使用更少的内存来解决这个问题?

  • 问题内容: 我正在寻找一种将NumPy数组传递给Matlab的方法。 我已经设法通过使用将数组存储到图像中,然后使用加载它来做到这一点,但这当然会使矩阵包含0到256之间的值,而不是“真实”值。 将这个矩阵的乘积除以256,再加上原始NumPy数组中的最大值,可以得出正确的矩阵,但是我觉得这有点乏味。 有没有更简单的方法? 问题答案: 当然,只要使用 举个例子: 同样,有。 然后,您使用将其加载到

  • 是否有方法变换以下对象数组: 变成这样?只返回日期: 我一直在尝试按如下方式推送日期元素,但似乎不起作用: 提前谢谢。

  • 问题内容: 如何在PHP中将数组转换为SimpleXML对象? 问题答案: 一个简短的: 结果是 键和值被交换- 您可以在array_walk之前用来解决。需要PHP5。您可以改用PHP 5 ,但那时您将不会进入xml。