【问题标题】:Calculate 3D variant for summed area table using numpy cumsum使用 numpy cumsum 计算求和面积表的 3D 变量
【发布时间】:2014-12-01 13:16:39
【问题描述】:

如果是二维数组,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 会怎样。它会给我同样的东西吗?

会不会比递归方法更高效?

【问题讨论】:

  • 已将array.cumsum(0).cumsum(0) 编辑为array.cumsum(0).cumsum(1),我认为这正是您想要的。
  • @tom10 嗨,汤姆。我没明白你的意思。你能再解释一下吗?
  • 我认为你在问题的第一行有错字,所以我修正了它。请阅读第一行并确保它现在是您想要的。
  • ©tom10 啊!现在没事了。谢谢。

标签: python algorithm numpy data-structures cumsum


【解决方案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))加速上述操作,否则将为此计算创建三个数组。最好的了解方法是测试(但仅在需要时)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2021-11-30
    相关资源
    最近更新 更多