t = timeit.timeit(stmt='ndimage.convolve(x, y, output=x)', number=1,
setup="""
import numpy as np
from scipy import ndimage
x = np.random.random((2048, 2048)).astype(np.float32)
y = np.random.random((32, 32)).astype(np.float32)
""")
print t
我的机器需要6.9秒。。。
将其与fftconvolve进行比较
t = timeit.timeit(stmt="signal.fftconvolve(x, y, mode='same')", number=1,
setup="""
import numpy as np
from scipy import signal
x = np.random.random((2048, 2048)).astype(np.float32)
y = np.random.random((32, 32)).astype(np.float32)
""")
print t
在我的机器上,使用FFTs的手工圆形卷积似乎很快:
注意,这可能与其他方法不同地对待靠近边缘的区域,因为这是一个循环卷积。
我也做了一些实验。我的猜测是SciPy卷积没有使用BLAS库来加速计算。使用BLAS,我能够编码一个与Matlab的速度相当的2D卷积,这是更多的工作,但你最好的办法是在C++中重新卷积。
这里是循环的紧密部分(请原谅基于怪异()的数组引用,这是我为MATLAB数组提供的便利类),关键部分是不要迭代图像,迭代过滤器,让BLAS迭代图像,因为通常图像比过滤器大得多。
这真的取决于你想做什么。。。很多时候,你不需要完全通用的二维卷积。。。(即,如果滤波器是可分离的,则使用两个一维卷积代替。。。这就是为什么不同的
scipy.ndimage.gaussian
,scipy.ndimage.uniform
比作为普通n-D卷积实现的同一事物要快得多。)无论如何,作为一个比较点:
我的机器需要6.9秒。。。
将其与
fftconvolve
进行比较这大约需要10.8秒。但是,对于不同的输入大小,使用fft进行卷积可以更快一些(尽管目前我似乎还不能给出一个很好的例子…)。
相关问题 更多 >
编程相关推荐