gpt4 book ai didi

python - Numpy 中的卷积比 Matlab 中的卷积慢吗?

转载 作者:太空狗 更新时间:2023-10-30 00:36:33 30 4
gpt4 key购买 nike

Matlab 中的卷积似乎比 Numpy 中的卷积快两倍。

Python 代码(在我的机器上需要 19 秒):

import numpy as np
from scipy import ndimage
import time

img = np.ones((512,512,512))
kernel = np.ones((5,5,5))/125

start_time = time.time()
ndimage.convolve(img,kernel,mode='constant')
print "Numpy execution took ", (time.time() - start_time), "seconds"

Matlab 代码(在我的机器上需要 8.7 秒):

img = ones(512,512,512);
kernel = ones(5,5,5) / 125;
tic
convn(img, kernel, 'same');
toc

两者给出相同的结果。

有没有办法改进 Numpy 以匹配或击败 Matlab 的性能?

有趣的是,运行时的这一因素或 ~2 差异在许多输入大小下都是一致的。

最佳答案

您具体在做什么操作?如果您不需要一般的 N 维卷积,ndimage 提供了许多优化。

比如你现在的操作:

img = np.ones((512,512,512))
kernel = np.ones((5,5,5))/125
result = ndimage.convolve(img, kernel)

相当于:

img = np.ones((512,512,512))
result = ndimage.uniform_filter(img, 5)

但是执行速度有很大的不同:

In [22]: %timeit ndimage.convolve(img, kernel)
1 loops, best of 3: 25.9 s per loop

In [23]: %timeit ndimage.uniform_filter(img, 5)
1 loops, best of 3: 8.69 s per loop

差异是由 uniform_filter 沿每个轴执行一维卷积而不是通用 3D 卷积引起的。

在内核对称的情况下,您可以进行这些简化并显着加快速度。

我不确定 convn,但如果您的输入数据符合特定条件,matlab 的函数通常会在幕后进行此类优化。 Scipy 更普遍地使用一个算法每个函数,并希望用户知道在哪种情况下选择哪个算法。


您提到了“高斯拉普拉斯算子”滤波器。我总是对这里的术语感到困惑。

我想你想要的 ndimage 功能是 scipy.ndimage.gaussian_laplace或带有 order=2scipy.ndimage.gaussian_filter(通过高斯的二阶导数进行过滤)。

无论如何,两者都将操作简化为每个轴上的一维卷积,这应该会带来显着的(2-3 倍)加速。

关于python - Numpy 中的卷积比 Matlab 中的卷积慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16719720/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com