【发布时间】:2021-12-27 02:56:26
【问题描述】:
如果我有z = cumsum( [ 0, 1, 2, 6, 9 ] ),它给了我z = [ 0, 1, 3, 9, 18 ],我怎样才能回到原来的数组[ 0, 1, 2, 6, 9 ]?
【问题讨论】:
如果我有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.cumsum 返回一个数组。
z = [ 0, 1, 3, 9, 18 ] 尝试这个,你只会得到一个AttributeError,因为z 真的必须是一个NumPy 数组而不是一个列表。 (np.cumsum 给出了一个数组,所以为了反转np.cumsum,这段代码可以正常工作。)我建议查看NumPy tutorial,尤其是“基本操作”和“索引、切片和迭代”部分.
您可以使用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)
【讨论】:
以下内容也保留了第一个元素:
np.diff(z, prepend=0)
【讨论】:
如果你想保留z,你可以使用np.ediff1d:
x = np.ediff1d(z, to_begin=z[0])
【讨论】:
我最喜欢的:
orig = np.r_[z[0], np.diff(z)]
【讨论】: