39

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

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

如果

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

然后

np.cumsum(x)

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

但是,我想得到

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

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

4

3 回答 3

66

这样做:

np.cumsum(x[::-1])[::-1] 
于 2013-05-14T11:14:13.587 回答
6

您也可以使用.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 开始是新的,并将 and 组合.flipud().fliplr()一个 API 中。 https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html

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

np.flip(np.flip(x, 0).cumsum(), 0)
于 2017-03-31T13:30:30.953 回答
5

如果您希望将结果存储在原始数组中,那么到目前为止给出的答案似乎都是低效的。同样,如果您想要一个副本,请记住这将返回一个视图而不是连续数组,并且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 的一个棘手部分,但如果您对性能非常感兴趣,那么视图和连续性是需要小心的。

于 2019-11-25T00:51:54.227 回答