谁能推荐一种在 numpy 数组上进行反向累积和的方法?
其中“反向累积和”定义如下(我欢迎对此程序的名称进行任何更正):
如果
x = np.array([0,1,2,3,4])
然后
np.cumsum(x)
给
array([0,1,3,6,10])
但是,我想得到
array([10,10,9,7,4]
谁能建议一种方法来做到这一点?
这样做:
np.cumsum(x[::-1])[::-1]
您也可以使用.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)
如果您希望将结果存储在原始数组中,那么到目前为止给出的答案似乎都是低效的。同样,如果您想要一个副本,请记住这将返回一个视图而不是连续数组,并且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 的一个棘手部分,但如果您对性能非常感兴趣,那么视图和连续性是需要小心的。