对 numpy 数组进行二次采样/平均
Posted
技术标签:
【中文标题】对 numpy 数组进行二次采样/平均【英文标题】:Subsampling/averaging over a numpy array 【发布时间】:2012-06-06 12:57:54 【问题描述】:我有一个带有浮点数的 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]
提前致谢。
【问题讨论】:
Averaging over every n elements of a numpy array的可能重复 【参考方案1】:使用 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])
只需将reshape
调用中的2
替换为您想要平均的项目数。
编辑:假设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])
【讨论】:
这个工作正常,除非窗口大小(上面示例中的 2)不是数组长度的乘积,但我可以确保这是。谢谢! 谢谢...是的,这正是我所考虑的。 有没有一种简单的方法可以将其概括为在多维数组中对单个轴进行下采样?例如将形状 [8,4] 的数组平均到 [4,4] ? 您能否提供一个解决方案,让我可以输入浮动下采样率。例如 2.7 @maniac 如果您有此处未回答的问题,请发布新问题,而不是评论现有答案。【参考方案2】: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]
【讨论】:
谢谢,我会尝试,但我希望会有一个 numpy 函数,因为它们往往比大多数类似的 Python 函数快 10 倍左右。【参考方案3】:这也是一种行之有效的解决方案:
downsampled_a = [a[i:n+i].mean() for i in range(0,size(a),n)]
“a”是包含您的数据的向量,“n”是您的采样步骤。
PS:from numpy import *
【讨论】:
它返回[1.5, 3.5, 5.0]
- 而不是 OP 所希望的 [1.5, 3.5]
。也使用np.size()
,而不是从numpy
全部导入。
上面的单行代码准确地返回了所要求的内容:[1.5, 3.5, 5.5] 而不是 [1.5, 3.5, 5.0]。剩下的 - 当然 - 可以删除(请参阅原始问题中的示例)。
numpy.size() 可以避免。 len() 就够了... (^_^)/*以上是关于对 numpy 数组进行二次采样/平均的主要内容,如果未能解决你的问题,请参考以下文章
如何根据数组的密度对数组进行二次采样? (去除频繁值,保留稀有值)