有人可以推荐一种在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]
有人可以提供一种方法来实现这个吗?
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()
是 NumPy1.12之后新增的函数,将 .flipud()
和 .fliplr()
结合成一个API。
这个函数与下面的函数调用等效且函数调用次数更少:
np.flip(np.flip(x, 0).cumsum(), 0)
np.cumsum(x[::-1])[::-1]
慢了一倍。我想可能有更多的开销。谢谢。 - Billnp.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的一个棘手部分,但如果您真正关心性能,视图和连续性是需要注意的。
np.cumsum(x[:, ::-1], axis=1)[:, ::-1]
将反向沿行求和。 - Matthew Cassell