【问题标题】:How can I find the final cumulative sum across numpy axis? [duplicate]如何找到 numpy 轴上的最终累积总和? [复制]
【发布时间】:2019-04-07 03:16:22
【问题描述】:

我有一个 numpy 数组

np.array(data).shape 
(50,50)

现在,我想找到轴 = 1 的累积和。问题是 cumsum 创建了一个累积和数组,但我只关心每一行的最终值。

这当然是不正确的:

np.cumsum(data, axis=1)[-1]

有没有一种简洁的方法可以在不循环数组的情况下做到这一点。

【问题讨论】:

  • 这个问题措辞有点奇怪,但是最后的累计总和还是只是总和,所以重复适用

标签: python numpy


【解决方案1】:

如果不需要任何ufunc的中间累加结果,可以使用numpy.ufunc.reduce

>>> a = np.arange(9).reshape(3,3)
>>> a
>>> 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> 
>>> np.add.reduce(a, axis=1)
>>> array([ 3, 12, 21])

但是,在sum 的情况下,Willem's answer 显然更胜一筹并且是首选。请记住,在一般情况下,有ufunc.reduce

【讨论】:

    【解决方案2】:

    您快到了,但正如您现在所拥有的那样,您只选择了最后一行。您需要的是从最后一列中选择所有行,因此最后的索引应该是:[:,-1]

    例子:

    >>> a
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19],
           [20, 21, 22, 23, 24]])
    
    >>> a.cumsum(axis=1)[:,-1]
    array([ 10,  35,  60,  85, 110])
    

    请注意,我将保留此内容,因为我认为它可以解释您的尝试出了什么问题,但不可否认,在其他答案中有更有效的方法!

    【讨论】:

    • 太棒了!非常感谢。
    【解决方案3】:

    每一行的final累积总和,其实就是每一行的sum,或者说row-wise sum,所以我们可以这样实现:

    >>> x.sum(axis=1)
    array([ 10,  35,  60,  85, 110])

    所以这里对于每一行,我们计算所有列的总和。因此,我们不需要首先生成两者之间的总和(这些可能会存储在 numpy 的累加器中),但不需要在数组中“发出”。

    【讨论】:

    • 哈,你说得对。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多