TheChymera - 9 months ago 162

Python Question

I have a 1-d numpy array which I would like to downsample. Any of the following methods are acceptable if the downsampling raster doesn't perfectly fit the data:

- overlap downsample intervals
- convert whatever number of values remains at the end to a separate downsampled value
- interpolate to fit raster

basically if I have

`1 2 6 2 1`

and I am downsampling by a factor of 3, all of the following are ok:

`3 3`

3 1.5

or whatever an interpolation would give me here.

I'm just looking for the fastest/easiest way to do this.

I found

`scipy.signal.decimate`

`scipy.signal.resample`

Could you give me a hand here? This seems like a really simple task to do, but all these functions are quite intricate...

Recommended for you: Get network issues from **WhatsUp Gold**. **Not end users.**

Answer Source

In the simple case where your array's size is divisible by the downsampling factor (`R`

), you can `reshape`

your array, and take the mean along the new axis:

```
import numpy as np
a = np.array([1.,2,6,2,1,7])
R = 3
a.reshape(-1, R)
=> array([[ 1., 2., 6.],
[ 2., 1., 7.]])
a.reshape(-1, R).mean(axis=1)
=> array([ 3. , 3.33333333])
```

In the general case, you can pad your array with `NaN`

s to a size divisible by `R`

, and take the mean using `scipy.nanmean`

.

```
import math, scipy
b = np.append(a, [ 4 ])
b.shape
=> (7,)
pad_size = math.ceil(float(b.size)/R)*R - b.size
b_padded = np.append(b, np.zeros(pad_size)*np.NaN)
b_padded.shape
=> (9,)
scipy.nanmean(b_padded.reshape(-1,R), axis=1)
=> array([ 3. , 3.33333333, 4.])
```

Recommended from our users: **Dynamic Network Monitoring from WhatsUp Gold from IPSwitch**. ** Free Download**