You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:52:35