如果是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
怎么办?它会给我同样的东西吗?
它会比递归方法更有效吗?
答案 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)
)来加速上述操作,否则将为此计算创建三个阵列。最好的方法是测试(但只有在你需要的时候)。