If I have z = cumsum( [ 0, 1, 2, 6, 9 ] )
, which gives me z = [ 0, 1, 3, 9, 18 ]
, how can I get back to the original array [ 0, 1, 2, 6, 9 ]
?
z[1:] -= z[:-1].copy()
Short and sweet, with no slow Python loops. We take views of all but the first element (z[1:]
) and all but the last (z[:-1]
), and subtract elementwise. The copy makes sure we subtract the original element values instead of the values we're computing. (On NumPy 1.13 and up, you can skip the copy
call.)
np.cumsum
returns an array. –
Merl z = [ 0, 1, 3, 9, 18 ]
like the question says, you'd just get an AttributeError
, since z
really has to be a NumPy array instead of a list. (np.cumsum
gives an array, so for the purposes of inverting np.cumsum
, this code works fine.) I'd recommend checking out the NumPy tutorial, particularly the "Basic Operations" and "Indexing, Slicing and Iterating" sections. –
Merl The following preserves the first element, too:
np.diff(z, prepend=0)
You can use np.diff
to compute elements 1...N
which will take the difference between any two elements. This is the opposite of cumsum
. The only difference is that diff
will not return the first element, but the first element is the same in the original and cumsum
output so we just re-use that value.
orig = np.insert(np.diff(z), 0, z[0])
Rather than insert
, you could also use np.concatenate
orig = np.concatenate((np.array(z[0]).reshape(1,), np.diff(z)))
We could also just copy and replace elements 1...N
orig = z.copy()
orig[1:] = np.diff(z)
If you want to keep z
, you can use np.ediff1d
:
x = np.ediff1d(z, to_begin=z[0])
My favorite:
orig = np.r_[z[0], np.diff(z)]
© 2022 - 2024 — McMap. All rights reserved.