我有一个带有浮点数的 numpy 数组。
我想要的(如果它不存在的话)是一个函数,它为我提供了一个新数组,其中包含给定数组中每个 x 点的平均值,例如子采样(与插值相反(?))。
例如 sub_sample(numpy.array([1, 2, 3, 4, 5, 6]), 2) 给出 [1.5, 3.5, 5.5]
例如,可以删除剩菜,例如 sub_sample(numpy.array([1, 2, 3, 4, 5]), 2) 给出 [1.5, 3.5]
提前致谢。
我有一个带有浮点数的 numpy 数组。
我想要的(如果它不存在的话)是一个函数,它为我提供了一个新数组,其中包含给定数组中每个 x 点的平均值,例如子采样(与插值相反(?))。
例如 sub_sample(numpy.array([1, 2, 3, 4, 5, 6]), 2) 给出 [1.5, 3.5, 5.5]
例如,可以删除剩菜,例如 sub_sample(numpy.array([1, 2, 3, 4, 5]), 2) 给出 [1.5, 3.5]
提前致谢。
使用 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])
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]
这也是一种有效的单行解决方案:
downsampled_a = [a[i:n+i].mean() for i in range(0,size(a),n)]
“a”是包含您的数据的向量,“n”是您的采样步骤。
PS:from numpy import *