使用核进行数组运算:求无循环的高效加权均值实现方案
高效实现数组滑动窗口加权均值(首尾保留)
给定数组:
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'参数会返回所有完全重叠的窗口结果,数量刚好为原数组长度减2sliding_window_view更直观,直接生成窗口矩阵,适合需要对窗口做额外处理的场景
内容的提问来源于stack exchange,提问作者Iphy Kelvin
相关产品推荐
相关产品推荐

