Reputation: 15347
I have a numpy array with floats.
What I would like to have (if it is not already existing) is a function that gives me a new array of the average of every x points in the given array, like sub sampling (and opposite of interpolation(?)).
E.g. sub_sample(numpy.array([1, 2, 3, 4, 5, 6]), 2) gives [1.5, 3.5, 5.5]
E.g. Leftovers can be removed, e.g. sub_sample(numpy.array([1, 2, 3, 4, 5]), 2) gives [1.5, 3.5]
Thanks in advance.
Upvotes: 11
Views: 16442
Reputation: 69
this is also a one line solution that works:
downsampled_a = [a[i:n+i].mean() for i in range(0,size(a),n)]
"a" is the vector with your data and "n" is your sampling step.
PS: from numpy import *
Upvotes: -1
Reputation: 46306
Using NumPy routines you could try something like
import numpy
x = numpy.array([1, 2, 3, 4, 5, 6])
numpy.mean(x.reshape(-1, 2), 1) # Prints array([ 1.5, 3.5, 5.5])
and just replace the 2
in the reshape
call with the number of items you want to average over.
Edit: This assumes that n
divides into the length of x
. You'll need to include some checks if you are going to turn this into a general function. Perhaps something like this:
def average(arr, n):
end = n * int(len(arr)/n)
return numpy.mean(arr[:end].reshape(-1, n), 1)
This function in action:
>>> x = numpy.array([1, 2, 3, 4, 5, 6])
>>> average(x, 2)
array([ 1.5, 3.5, 5.5])
>>> x = numpy.array([1, 2, 3, 4, 5, 6, 7])
>>> average(x, 2)
array([ 1.5, 3.5, 5.5])
Upvotes: 32
Reputation: 11163
def subsample(data, sample_size):
samples = list(zip(*[iter(data)]*sample_size)) # use 3 for triplets, etc.
return map(lambda x:sum(x)/float(len(x)), samples)
l = [1, 2, 3, 4, 5, 6]
print subsample(l, 2)
print subsample(l, 3)
print subsample(l, 5)
Gives:
[1.5, 3.5, 5.5]
[2.0, 5.0]
[3.0]
Upvotes: 3