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

能否通过移动窗口加权平均生成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,提问作者Μανώλης Παναγιωτάκης

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:30:00