如何加快数组元素的总和?

时间:2019-02-04 21:04:14

标签: python numba f2py

我想对3d数组求和,但是将n元素按n分组。明确地执行此操作需要大量执行时间。

我尝试使用numba,但并没有改善。使用f2py可能会起作用,但是在这种情况下,我希望跳过它。

fsum=np.zeros([N,M,L])
for i in range(0,N):
     for j in range(1,M-1):
       for k in range(0,L):
           for h in range(j-5,j+5):
               fsum[i,j,k]=fsum[i,j,k]+g[i,h,k]

我想找到一种写法来提高性能。我该怎么办?

1 个答案:

答案 0 :(得分:0)

如果可以使用scipy,则可以使用n维卷积:

import numpy as np
from scipy.ndimage.filters import convolve

这是你的归功

g = np.ones((100,100,5) 

在这里定义卷积的“窗口”

ker = np.ones((1,11,1)) # = [[[1] [1] [1] [1] [1] [1] [1] [1] [1] [1] [1]]]

然后您使用一种处理边界的模式来计算卷积

# constant means that a 0-padding will be added to border to compute the convolution
fmat = convolve(g, ker, mode='constant') 

显示结果

print(fmat)

Cf。 Here了解更多详情。

编辑:

您要为第二维将元素乘以5乘5。因此,您要为每个像素计算围绕该像素的1x11x1窗口的总和(这是for循环,范围从j-5到j + 5)。这可以使用卷积来计算(例如,对图像应用滤镜就是卷积)。