如何优化Python移动平均函数,无需硬编码窗口大小?
动态窗口大小的移动平均滤波实现
你的原始代码硬编码了12的窗口大小,扩展性差,而且手动拼接索引的方式既繁琐又容易出错。拼接字符串生成计算逻辑的思路完全没必要,反而会引入类型错误和安全风险,直接用numpy的切片或内置函数就能优雅解决问题。
以下是几种优化后的实现方案:
基础循环实现(兼容原有逻辑)
import numpy as np def movingAvgR(data, window_size=12): data = data.to_numpy() filteredData = [] # 计算可滑动的次数:总数据长度 - 窗口大小 + 1 slide_count = len(data) - window_size + 1 for i in range(slide_count): # 通过切片获取当前窗口的所有元素,求和后取平均 window_avg = np.sum(data[i:i+window_size]) / window_size filteredData.append(window_avg) return np.array(filteredData)
- 新增
window_size参数,默认值设为12,保持原有功能的同时支持动态调整 - 用
data[i:i+window_size]切片替代硬编码的索引拼接,简洁且不易出错 - 最终返回numpy数组,和原函数输出类型一致
高效numpy卷积实现(大数据场景推荐)
如果处理的数据量较大,循环的效率会很低,推荐用numpy的卷积函数实现:
import numpy as np def movingAvgR(data, window_size=12): data = data.to_numpy() # 生成窗口权重数组,每个元素占比为1/窗口大小 window_weights = np.ones(window_size) / window_size # 卷积计算移动平均,mode='valid'确保只返回窗口完全覆盖数据的结果 filteredData = np.convolve(data, window_weights, mode='valid') return filteredData
np.convolve是底层优化的C实现,比Python循环快几个数量级mode='valid'的结果长度和原循环逻辑完全一致,不会产生边界补零的多余结果
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

