使用numpy cumsum计算求和面积表的3D变量

时间:2014-12-01 13:16:40

标签: python algorithm numpy data-structures cumsum

如果是2D数组,array.cumsum(0).cumsum(1)会得到数组的Integral image

如果我在3D数组上计算array.cumsum(0).cumsum(1).cumsum(2)会怎样?

我是否获得了积分图像的3D扩展,即阵列上的积分体积?

很难想象出3D情况会发生什么。

我已经完成了这个讨论。 3D variant for summed area table (SAT)

这给出了如何计算积分体积的递归方法。如果沿3轴使用cumsum怎么办?它会给我同样的东西吗?

它会比递归方法更有效吗?

1 个答案:

答案 0 :(得分:1)

是的,您提供的公式array.cumsum(0).cumsum(1).cumsum(2)将起作用。

公式的作用是计算一些部分和,以便这些总和的总和是体积和。也就是说,每个元素都需要恰好相加一次,换句话说,不能跳过任何元素,也不会计算两次元素。我认为仔细阅读这些问题(任何跳过或计算两次的元素)都是验证自己是否有效的好方法。并且还进行了一个小测试:

x = np.ones((20,20,20)).cumsum(0).cumsum(1).cumsum(2)

print x[2,6,10]   # 231.0
print 3*7*11      # 231

当然,对于所有的错误,可能有两个相互抵消的错误,但这不会发生在任何地方,所以这是一个合理的测试。

至于效率,我猜测单通道方法可能更快,但不是很多。此外,可以使用输出数组(例如cumsum(n, out=temp))来加速上述操作,否则将为此计算创建三个阵列。最好的方法是测试(但只有在你需要的时候)。

相关问题