在numpy数组上执行反向累加和

42

有人可以推荐一种在numpy数组上进行反向累加的方法吗?

'reverse cumulative sum' 的定义如下(欢迎对此程序名称进行任何更正):

如果

x = np.array([0,1,2,3,4])
然后。
np.cumsum(x)

提供

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

然而,我想要得到

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

有人可以提供一种方法来实现这个吗?

3个回答

70
这就做到了:
np.cumsum(x[::-1])[::-1] 

2
一种等效但不同的语法是: x[::-1].cumsum()[::-1] - Staza
1
对于想了解的人,对于多维数组,你只需要保持任何行/列不变,即如果x是一个二维数组,则 np.cumsum(x[:, ::-1], axis=1)[:, ::-1] 将反向沿行求和。 - Matthew Cassell

7

2
顺便提一下,对于小数组(<50个元素),我发现这些解决方案比np.cumsum(x[::-1])[::-1]慢了一倍。我想可能有更多的开销。谢谢。 - Bill

6
到目前为止,给出的答案似乎都不够高效,如果你想将结果存储在原始数组中。此外,如果你想要一份副本,请记住这将返回一个视图而不是连续的数组,并且仍然需要使用 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的一个棘手部分,但如果您真正关心性能,视图和连续性是需要注意的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接