栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用NumPy / SciPy计算滚动/移动平均值?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用NumPy / SciPy计算滚动/移动平均值?

一种简单的方法是使用

np.convolve
。其背后的想法是利用离散卷积的计算方式,并使用它来返回
滚动平均值
。这可以通过
np.ones
对长度等于我们想要的滑动窗口长度的序列进行卷积来完成。

为此,我们可以定义以下函数:

def moving_average(x, w):    return np.convolve(x, np.ones(w), 'valid') / w

该函数将对序列

x
和长度为1的序列进行卷积
w
。请注意,选择的
mode
方式
valid
是仅对序列完全重叠的点给出卷积。


一些例子:

x = np.array([5,3,8,10,2,1,5,1,0,2])

对于具有窗口长度的移动平均值,

2
我们将有:

moving_average(x, 2)# array([4. , 5.5, 9. , 6. , 1.5, 3. , 3. , 0.5, 1. ])

对于一个长度的窗口

4

moving_average(x, 4)# array([6.5 , 5.75, 5.25, 4.5 , 2.25, 1.75, 2.  ])

convolve
工作如何?

让我们更深入地了解离散卷积的计算方式。以下功能旨在复制

np.convolve
计算输出值的方式:

def mov_avg(x, w):    for m in range(len(x)-(w-1)):        yield sum(np.ones(w) * x[m:m+w]) / w

对于上面的相同示例,这还将产生:

list(mov_avg(x, 2))# [4.0, 5.5, 9.0, 6.0, 1.5, 3.0, 3.0, 0.5, 1.0]

所以在每个步骤要做的是取一个数组与当前 窗口 之间的内积。在这种情况下,乘以

np.ones(w)
是多余的,因为我们直接取
sum
序列的。

波纹管是一个示例,该示例说明了如何计算第一个输出,从而使输出更加清晰。假设我们需要一个窗口

w=4

[1,1,1,1][5,3,8,10,2,1,5,1,0,2]= (1*5 + 1*3 + 1*8 + 1*10) / w = 6.5

并且以下输出将计算为:

  [1,1,1,1][5,3,8,10,2,1,5,1,0,2]= (1*3 + 1*8 + 1*10 + 1*2) / w = 5.75

依此类推,一旦执行了所有重叠操作,就返回序列的移动平均值。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407373.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号