【问题标题】:What is the inverse of the numpy cumsum function?numpy cumsum 函数的反函数是什么?
【发布时间】:2021-12-27 02:56:26
【问题描述】:

如果我有z = cumsum( [ 0, 1, 2, 6, 9 ] ),它给了我z = [ 0, 1, 3, 9, 18 ],我怎样才能回到原来的数组[ 0, 1, 2, 6, 9 ]

【问题讨论】:

    标签: python numpy cumsum


    【解决方案1】:
    z[1:] -= z[:-1].copy()
    

    短小精悍,没有缓慢的 Python 循环。我们取除第一个元素 (z[1:]) 和除最后一个元素 (z[:-1]) 之外的所有元素的视图,然后逐元素减去。副本确保我们减去原始元素值而不是我们正在计算的值。 (On NumPy 1.13 and up,您可以跳过copy 通话。)

    【讨论】:

    • 我认为这行不通,我收到此错误消息:AttributeError: 'list' object has no attribute 'copy'
    • @Pedro:那是因为您使用的是列表而不是数组。尽管有问题的表示法,np.cumsum 返回一个数组。
    • 谢谢,你的回答太棒了!我想这就是 np.diff 幕后发生的事情。如果没有,也许应该是。
    • 作为一个对 Python 语法不太熟悉的人,我对这里发生的事情有点迷茫。我很想在问题中看到解释! :)
    • @JeffBridgman:这是一种非常特定于 NumPy 的做事方式,因此一般的 Python 语法知识不会有太大帮助。特别是,如果你像问题所说的那样用z = [ 0, 1, 3, 9, 18 ] 尝试这个,你只会得到一个AttributeError,因为z 真的必须是一个NumPy 数组而不是一个列表。 (np.cumsum 给出了一个数组,所以为了反转np.cumsum,这段代码可以正常工作。)我建议查看NumPy tutorial,尤其是“基本操作”和“索引、切片和迭代”部分.
    【解决方案2】:

    您可以使用np.diff 计算元素1...N,这将获取任意两个元素之间的差异。这与cumsum 正好相反。唯一的区别是diff 不会返回第一个元素,但第一个元素在原始和cumsum 输出中是相同的,所以我们只是重新使用该值。

    orig = np.insert(np.diff(z), 0, z[0])
    

    除了insert,您还可以使用np.concatenate

    orig = np.concatenate((np.array(z[0]).reshape(1,), np.diff(z)))
    

    我们也可以只复制和替换元素1...N

    orig = z.copy()
    orig[1:] = np.diff(z)
    

    【讨论】:

      【解决方案3】:

      以下内容也保留了第一个元素:

      np.diff(z, prepend=0)
      

      【讨论】:

        【解决方案4】:

        如果你想保留z,你可以使用np.ediff1d

        x = np.ediff1d(z, to_begin=z[0])
        

        【讨论】:

          【解决方案5】:

          我最喜欢的:

          orig = np.r_[z[0], np.diff(z)]
          

          【讨论】:

            猜你喜欢
            • 2018-08-16
            • 2014-11-13
            • 2021-12-09
            • 2012-12-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多