numpy cumsum 函数的反函数是什么?

What is the inverse of the numpy cumsum function?

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

z[1:] -= z[:-1].copy()

简短而甜美,没有缓慢的 Python 循环。我们查看除第一个元素 (z[1:]) 和除最后一个 (z[:-1]) 之外的所有元素,然后按元素相减。该副本确保我们减去原始元素值而不是我们正在计算的值。 (On NumPy 1.13 and up,您可以跳过 copy 调用。)

您可以使用 np.diff 来计算元素 1...N,这将取任意两个元素之间的差值。这与cumsum相反。唯一的区别是 diff 不会 return 第一个元素,但第一个元素在原始和 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)

我最喜欢的:

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

如果要保留z,可以使用np.ediff1d:

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

下面也保留第一个元素:

np.diff(z, prepend=0)