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

如何用向量化方式实现带环绕填充的二维数组滑动窗口求和?

二维数组3x3滑动窗口求和(环绕填充)的向量化优化方案

核心思路

用numpy的周期性索引+广播机制彻底替代嵌套循环,大数组处理效率直接拉满。

具体实现代码

import numpy as np

# 定义3x3窗口的9个偏移量
offsets = np.array([[-1,-1], [-1,0], [-1,1],
                    [0,-1],  [0,0],  [0,1],
                    [1,-1],  [1,0],  [1,1]])

# 示例大数组(替换成你的输入数组)
arr = np.random.rand(1000, 1000)
rows, cols = arr.shape

# 生成所有中心位置的网格索引
i_grid, j_grid = np.meshgrid(np.arange(rows), np.arange(cols), indexing='ij')

# 计算每个窗口位置的索引,取模实现环绕填充
i_indices = (i_grid[..., np.newaxis] + offsets[:, 0]) % rows
j_indices = (j_grid[..., np.newaxis] + offsets[:, 1]) % cols

# 索引数组并求和,得到最终结果
result = arr[i_indices, j_indices].sum(axis=-1)

关键细节解释

  • 你之前用np.mgrid报错的原因:直接用二维索引数组嵌套索引(比如arr[i_grid+offset, j_grid+offset])不符合numpy高级索引规则,必须通过np.newaxis扩展维度,让网格和偏移量实现广播匹配。
  • % rows/% cols是环绕填充的核心:比如i=-1时取模后变成rows-1,i=rows时变成0,完美模拟边缘环绕效果。
  • 最终arr[i_indices, j_indices]会生成形状为(rows, cols, 9)的数组,沿最后一维求和就得到每个(i,j)对应的窗口和。

性能优势

拿1000x1000的数组测试:嵌套循环可能要几十秒,这个向量化方案只需要几十毫秒,效率提升几十到上百倍。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:07:44