对numpy数组进行子采样/平均

时间:2012-06-01 09:23:17

标签: python arrays numpy subsampling

我有一个带浮动的numpy数组。

我想要的是(如果它还没有存在)是一个函数,它给出了给定数组中每个x点的平均值的新数组,如子采样(和插值(?)的相反)

E.g。 sub_sample(numpy.array([1,2,3,4,5,6]),2)给出[1.5,3.5,5.5]

E.g。剩余物可以被移除,例如sub_sample(numpy.array([1,2,3,4,5]),2)给出[1.5,3.5]

提前致谢。

3 个答案:

答案 0 :(得分:22)

使用NumPy例程,您可以尝试类似

的内容
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])

只需将2来电中的reshape替换为您想要平均的项目数。

修改:这假设n分为x的长度。如果要将其转换为通用函数,则需要包含一些检查。也许是这样的:

def average(arr, n):
    end =  n * int(len(arr)/n)
    return numpy.mean(arr[:end].reshape(-1, n), 1)

此功能在行动:

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

答案 1 :(得分:3)

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)

给出:

[1.5, 3.5, 5.5]
[2.0, 5.0]
[3.0]

答案 2 :(得分:-1)

这也是一个有效的单行解决方案:

downsampled_a = [a[i:n+i].mean() for i in range(0,size(a),n)]

""是您的数据和" n"是你的采样步骤。

PS:from numpy import *