【问题标题】:Perform a reverse cumulative sum on a numpy array对 numpy 数组执行反向累积和
【发布时间】:2013-05-08 15:24:20
【问题描述】:

谁能推荐一种在 numpy 数组上进行反向累积和的方法?

“反向累积和”的定义如下(我欢迎对此过程的名称进行任何更正):

如果

x = np.array([0,1,2,3,4])

然后

np.cumsum(x)

给予

array([0,1,3,6,10])

但是,我想得到

array([10,10,9,7,4]

谁能建议一种方法来做到这一点?

【问题讨论】:

    标签: python arrays numpy cumsum


    【解决方案1】:

    这样做:

    np.cumsum(x[::-1])[::-1] 
    

    【讨论】:

    • 等价方式,但语法不同:x[::-1].cumsum()[::-1]
    【解决方案2】:

    你也可以使用.flipud(),相当于[::-1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.flipud.html

    In [0]: x = np.array([0,1,2,3,4])
    
    In [1]: np.flipud(np.flipud(x).cumsum())
    Out[1]: array([10, 10,  9,  7,  4]
    

    .flip() 是 NumPy 1.12 的新功能,将 .flipud().fliplr() 组合到一个 API 中。 https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html

    这是等价的,并且函数调用更少:

    np.flip(np.flip(x, 0).cumsum(), 0)
    

    【讨论】:

    • 仅供参考。对于小型数组(np.cumsum(x[::-1])[::-1] 的两倍。我想必须有更多的开销。谢谢。
    【解决方案3】:

    如果您希望将结果存储在原始数组中,那么到目前为止给出的答案似乎都是低效的。同样,如果您想要一个副本,请记住,这将返回一个视图而不是连续数组,并且仍然需要 np.ascontiguousarray()

    怎么样

    view=np.flip(x, 0)
    np.cumsum(view, 0, out=view)
    #x contains the reverse cumsum result and remains contiguous and unflipped
    

    这会修改x 的翻转视图,它将数据以相反的顺序正确地写回到原始的x 变量中。它在执行结束时不需要不连续的视图,并且尽可能地提高速度。我猜 numpy 永远不会添加一个 reversecumsum 方法,因为我描述的技术是如此简单和有效。尽管如此,使用显式方法可能会稍微高效一些。

    否则,如果需要复制,则需要进行额外的翻转并将其转换回连续数组,主要是在此后的许多向量操作中使用它时。 numpy 的一个棘手部分,但如果您对性能非常感兴趣,那么视图和连续性是需要小心的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 2021-01-15
      • 1970-01-01
      • 2017-04-02
      • 2018-08-17
      • 2015-11-27
      • 2018-02-28
      相关资源
      最近更新 更多