scottlittle
scottlittle

Reputation: 20902

What is the inverse of the numpy cumsum function?

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 ] ?

Upvotes: 27

Views: 13825

Answers (5)

BlackHC
BlackHC

Reputation: 702

The following preserves the first element, too:

np.diff(z, prepend=0)

Upvotes: 17

kuppern87
kuppern87

Reputation: 1135

If you want to keep z, you can use np.ediff1d:

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

Upvotes: 5

user2357112
user2357112

Reputation: 281476

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.)

Upvotes: 44

stmax
stmax

Reputation: 6605

My favorite:

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

Upvotes: 3

Suever
Suever

Reputation: 65460

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)

Upvotes: 10

Related Questions