### Question :

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

?

##
Answer #1:

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

##
Answer #2:

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

##
Answer #3:

If you want to keep `z`

, you can use `np.ediff1d`

:

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

##
Answer #4:

My favorite:

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