请详细解释sum(x[i-n:i+n+1])中切片i-n:i+n+1的起止范围
滑动平滑函数
smooth_a代码详解 这是一个实现滑动平均平滑的Python函数,作用是对输入列表做邻域均值处理,让数据变得更平滑。下面逐部分拆解:
1. 列表扩展处理
第一行代码x = [x[0]]*n + x + [x[-1]]*n是为了解决边界问题:原列表的首尾元素没有足够的左右邻域(比如第一个元素左边没有元素),所以用首尾元素各自复制n份,分别补在原列表的左侧和右侧,让后续每个元素都能取到完整的n个左邻域和n个右邻域元素。
2. 核心循环与切片解析
循环for i in range(n, len(x)-n)是遍历扩展后列表的有效区域——跳过开头补的n个元素和结尾补的n个元素,只处理对应原列表元素的位置。
切片x[i-n:i+n+1]的位置说明
- 起始位置:
i - n,切片会包含这个索引对应的元素 - 结束位置:
i + n + 1,切片不会包含这个索引对应的元素 - 切片总长度:
(i+n+1) - (i-n) = 2n+1,正好是「当前元素 + 左边n个元素 + 右边n个元素」的总个数,也就是滑动窗口的大小。
sum(x[i-n:i+n+1])的含义
这个操作就是把滑动窗口内的所有元素求和,再除以窗口大小2n+1,得到当前位置的滑动平均值,也就是平滑后的值。
3. 实例验证(n=1的情况)
原列表x = [1, 2, 6, 4, 5, 0, 1, 2],n=1时:
- 扩展后的x为
[1,1,1,2,6,4,5,0,1,2,2,2] - 循环i从1到10(
range(1, 11)):- 当i=1时,切片
x[0:3] = [1,1,1],求和后除以3得1.0,对应原列表第一个元素的平滑值 - 当i=2时,切片
x[1:4] = [1,1,2],求和得4,除以3≈1.333,对应原列表第二个元素的平滑值 - 以此类推,最终得到的平滑列表为
[1.0, 1.3333333333333333, 3.6666666666666665, 4.0, 3.0, 2.0, 1.0, 1.6666666666666667]
- 当i=1时,切片
内容的提问来源于stack exchange,提问作者Kwame Holland
相关产品推荐
相关产品推荐

