能否通过移动窗口加权平均生成2D数组?numpy/scipy有对应函数吗?
你需要的移动窗口加权平均属于2D离散卷积运算,NumPy和SciPy都有成熟的内置函数可以直接实现,无需手动编写滑动窗口逻辑。
运算效果示意

推荐实现方案
方法1:使用SciPy的ndimage.convolve(最适配加权场景)
该方法支持自定义权重核,内置多种边界填充策略,底层为C实现,运算效率高,是最适合该需求的方案。
示例代码如下:
import numpy as np from scipy.ndimage import convolve # 原始2D数组示例 input_arr = np.array([ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16] ]) # 自定义权重核,使用前建议归一化,保证权重和为1以得到平均结果 weight_kernel = np.array([ [0.05, 0.1, 0.05], [0.1, 0.4, 0.1], [0.05, 0.1, 0.05] ]) # 执行卷积计算 # mode参数控制边界处理逻辑: # - 'same':输出和原数组尺寸一致,自动填充边界 # - 'valid':仅输出窗口完全覆盖的区域,输出尺寸=原尺寸-核尺寸+1 # - 'constant':边界用固定值填充,默认填充0 result = convolve(input_arr, weight_kernel, mode='same') print(result)
方法2:纯NumPy实现(无SciPy依赖场景可用)
NumPy 1.20及以上版本提供了sliding_window_view接口,可以直接生成滑动窗口视图,自行完成加权求和即可:
import numpy as np from numpy.lib.stride_tricks import sliding_window_view input_arr = np.array([ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16] ]) weight_kernel = np.array([ [0.05, 0.1, 0.05], [0.1, 0.4, 0.1], [0.05, 0.1, 0.05] ]) # 生成3x3滑动窗口视图 window_view = sliding_window_view(input_arr, window_shape=(3,3)) # 加权求和得到结果 result = (window_view * weight_kernel).sum(axis=(-1,-2)) print(result)
该方法默认返回valid模式的结果,如果需要和原数组同尺寸,需要提前手动对原数组做边界填充。
补充说明
- 如果是均匀权重的平均计算,无需自定义核,可直接调用
scipy.ndimage.uniform_filter,传入窗口尺寸即可。 - 处理超大数组时优先选择
ndimage.convolve,内存占用和运算速度都优于手动滑动窗口的实现。
内容的提问来源于stack exchange,提问作者Μανώλης Παναγιωτάκης
相关产品推荐
相关产品推荐

