我目前正在尝试计算10.000 x 10.000数组值中所有子方格总和的总和.例如,如果我的数组是:
1 1 1
2 2 2
3 3 3
我希望结果如下:
1+1+1+2+2+2+3+3+3 [sum of squares of size 1]
+(1+1+2+2)+(1+1+2+2)+(2+2+3+3)+(2+2+3+3) [sum of squares of size 2]
+(1+1+1+2+2+2+3+3+3) [sum of squares of size 3]
________________________________________
68
所以,作为第一次尝试,我写了一个非常简单的python代码来做到这一点.因为它在O(k ^ 2.n ^ 2)中(n是大数组的大小,k是我们得到的子方形的大小),处理非常长.我在O(n ^ 2)中编写了另一个算法来加速它:
def getSum(tab,size):
n = len(tab)
tmp = numpy.zeros((n,n))
for i in xrange(0,n):
sum = 0
for j in xrange(0,size):
sum += tab[j][i]
tmp[0][i] = sum
for j in xrange(1,n-size+1):
sum += (tab[j+size-1][i] - tab[j-1][i])
tmp[j][i] = sum
finalsum = 0
for i in xrange(0,n-size+1):
sum = 0
for j in xrange(0,size):
sum += tmp[i][j]
finalsum += sum
for j in xrange(1,n-size+1):
finalsum += (tmp[i][j+size-1] - tmp[i][j-1])
return finalsum
所以这段代码工作正常.给定一个数组和子方格的大小,它将返回所有这些子方格中的值的总和.我基本上迭代子方块的大小来获得所有可能的值.
问题是对于大型阵列来说这又是一件好事(对于一个10.000 x 10.000阵列超过20天).我用Google搜索并了解到我可以使用numpy对迭代进行矢量化.但是,在我的情况下,我无法弄清楚如何制作它……
如果有人可以帮助我加快算法速度,或者给我一些关于这个主题的好文档,我会很高兴的!
谢谢 !