 TheChymera - 1 year ago 298
Python Question

# Downsample a 1D numpy array

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`
, but that sounds like it decimates the values (takes them out as needed and only leaves one in X).
`scipy.signal.resample`
seems to have the right name, but I do not understand where they are going with the whole fourier thing in the description. My signal is not particularly periodic.

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

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