【发布时间】:2016-09-14 13:46:18
【问题描述】:
我目前正在尝试计算 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 天),这又太长了。我用谷歌搜索并了解到我可以使用 numpy 对数组上的迭代进行矢量化。但是,在我的情况下,我无法弄清楚如何做到这一点......
如果有人可以帮助我加快算法速度,或者为我提供有关该主题的良好文档,我会很高兴!
谢谢!
【问题讨论】:
-
我认为计算矩阵中每个数字的计数次数会得到更好的方法...
-
请看我的编辑:我得到一个 O(n^2) 算法...
标签: python arrays algorithm numpy vectorization