加速Python Numpy代码

加速Python Numpy代码,python,numpy,cython,Python,Numpy,Cython,我有以下代码: big_k = gabor((height * 2, width *2), (height, width)) for r_slice in range(0,radialSlices): r_pixels = r_slice * radialWidth for a_slice in range(0,angularSlices): a_pixels = a_slice * angularWidth k_win = big_k[height - r_pixels

我有以下代码:

big_k = gabor((height * 2, width *2), (height, width))
for r_slice in range(0,radialSlices):
  r_pixels = r_slice * radialWidth
  for a_slice in range(0,angularSlices):
    a_pixels = a_slice * angularWidth
    k_win = big_k[height - r_pixels:2*height - r_pixels,width - a_pixels:2 * width - a_pixels]
    result = np.sum(img * k_win)
img
是一个640x480的
uint8
阵列,
big_k
complex64
1280x960

此代码相当于1024个640x480矩阵乘法和对complex64的转换


这段代码在我的macbook上运行大约需要2秒;我想尝试获得100倍的加速。我能做什么?

您所做的看起来有点像卷积运算,所以我建议尝试使用卷积运算来实现它。卷积可以通过基于FFT的方法非常有效地计算,并在SciPy中实现为
SciPy.signal.fftconvolve

您实际想要实现什么?实际上,这看起来就像一个大卷积。如果是这种情况,可以尝试使用Scipy的卷积函数,或者使用基于FFT的卷积方法。其思想是在图像的多个点上应用一个以点为中心的滤波器,然后取每个点上的结果值之和。仔细想想,它类似于卷积。我能把这两个数据进行卷积,然后在每个点上取结果吗?在这种情况下也不需要求和,好吗?还是我误解了?基本上,是的。卷积可能要快得多,您可以在图像中的每个点(或仅在选定点,由您选择)获得结果。试试看
scipy.signal.fftconvolve
。好吧,太棒了,我刚试过。加速大约是2-3倍,这是一个巨大的进步,加上一个更“性感”的解决方案。这完全改变了代码,所以我猜这个问题得到了回答!我可以从这里继续优化。如果你想把答案写在下面,我会接受的!谢谢