Numpy.cumsum相反

Amx*_*mxx 4 python numpy

这是向前方向的cumsum:

> import numpy as np
> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
> np.cumsum(np.arange(10))
array([ 0,  1,  3,  6, 10, 15, 21, 28, 36, 45])
Run Code Online (Sandbox Code Playgroud)

我想反向执行cumsum,这会给我

array([45, 45, 44, 42, 39, 35, 30, 24, 17, 9])
Run Code Online (Sandbox Code Playgroud)

最简单,最有效的方法是什么?

SmC*_*lar 5

最简单的我能想到并产生你的结果

import numpy as np
x = np.arange(10)
x[::-1].cumsum()[::-1]
Run Code Online (Sandbox Code Playgroud)

这使

array([45, 45, 44, 42, 39, 35, 30, 24, 17,  9])
Run Code Online (Sandbox Code Playgroud)

编辑:正如dg99指出的那样,还有一篇关于反转阵列效率的帖子.因此,[::-1]似乎是你能得到的最好的.因此,x[::-1].cumsum()[::-1]似乎也是最有效的反向积累方式.

第二次编辑:为了完整性,如果你有一个多维数组,你可以通过以下方式获得最内层维度的反向积累:

x[...,::-1].cumsum(axis=-1)[...,::-1]
Run Code Online (Sandbox Code Playgroud)

例如,

x = np.array(((range(10), range(10)), (range(10), range(10))))
print(x)
Run Code Online (Sandbox Code Playgroud)

版画

array([[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]],

   [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]])
Run Code Online (Sandbox Code Playgroud)

 x[...,::-1].cumsum(axis=-1)[...,::-1]
Run Code Online (Sandbox Code Playgroud)

回报

array([[[45, 45, 44, 42, 39, 35, 30, 24, 17,  9],
    [45, 45, 44, 42, 39, 35, 30, 24, 17,  9]],

   [[45, 45, 44, 42, 39, 35, 30, 24, 17,  9],
    [45, 45, 44, 42, 39, 35, 30, 24, 17,  9]]])
Run Code Online (Sandbox Code Playgroud)