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

使用核进行数组运算:求无循环的高效加权均值实现方案

高效实现数组滑动窗口加权均值(首尾保留)

给定数组:

B = np.array([1, 1, 2, 3, 3])

需求:使用核[1.0, -5.0, 1.0]对数组中连续3个元素计算加权和后取均值,数组首尾元素直接保留(但会参与相邻窗口的加权运算)。例如第一个窗口计算为(1×1.0 -5×1 +1×2)/3.0 = -0.67,预期结果如下:

result = np.array([1.0, -0.67, -2.0, -3.33, 3.0])

方法一:使用np.convolve实现

利用卷积运算的加权和特性,快速计算窗口结果:

import numpy as np

B = np.array([1, 1, 2, 3, 3])
kernel = np.array([1.0, -5.0, 1.0])
window_size = len(kernel)

# 计算所有有效窗口的加权和
convolved = np.convolve(B, kernel, mode='valid')
# 计算窗口均值
middle_vals = convolved / window_size
# 拼接首尾元素与中间结果
result = np.hstack([B[0], middle_vals, B[-1]])
# 保留两位小数匹配预期格式
result = np.round(result, 2)

print(result)
# 输出: [ 1.   -0.67 -2.   -3.33  3.  ]

方法二:使用sliding_window_view实现

直接生成滑动窗口,直观计算加权均值:

import numpy as np

B = np.array([1, 1, 2, 3, 3])
kernel = np.array([1.0, -5.0, 1.0])
window_size = len(kernel)

# 生成所有连续3元素的滑动窗口
windows = np.lib.stride_tricks.sliding_window_view(B, window_size)
# 计算每个窗口的加权和并取均值
middle_vals = (windows @ kernel) / window_size
# 拼接首尾元素与中间结果
result = np.hstack([B[0], middle_vals, B[-1]])
# 保留两位小数匹配预期格式
result = np.round(result, 2)

print(result)
# 输出: [ 1.   -0.67 -2.   -3.33  3.  ]

说明:

  • 两种方法均无需循环,利用numpy的向量化运算实现高效计算,适合处理大规模数组
  • np.convolve的mode='valid'参数会返回所有完全重叠的窗口结果,数量刚好为原数组长度减2
  • sliding_window_view更直观,直接生成窗口矩阵,适合需要对窗口做额外处理的场景

内容的提问来源于stack exchange,提问作者Iphy Kelvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:06:13