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

如何获取NumPy数组滑动窗口最大元素在原矩阵中的位置

NumPy滑动窗口最大值对应原坐标实现方案

你可以通过窗口相对偏移叠加窗口起始坐标的方式,直接算出每个窗口内第一个最大值在原始数组的位置,全程用NumPy向量化运算实现,无Python循环,效率很高。

完整实现代码

import numpy as np

# 测试用原始数组
a = np.array([[51, 92, 14, 71, 60, 20],
              [82, 86, 74, 74, 87, 66],
              [23,  2, 21, 52,  1, 87],
              [29, 37,  1, 63, 59, 20],
              [32, 75, 57, 21, 83, 48]])

win_h, win_w = 3, 3
# 生成滑动窗口视图
windows = np.lib.stride_tricks.sliding_window_view(a, (win_h, win_w))
# 计算每个窗口的最大值(和你原有逻辑一致)
window_max = np.amax(windows, axis=(2, 3))

# 把每个窗口展平为一维,取第一个最大值的一维偏移量
flat_max_idx = np.argmax(windows.reshape(*windows.shape[:2], -1), axis=-1)
# 一维偏移转换为窗口内的相对行、列坐标
rel_row, rel_col = flat_max_idx // win_w, flat_max_idx % win_w

# 生成每个窗口左上角在原数组的起始行、列坐标
win_start_rows = np.arange(windows.shape[0])[:, None]
win_start_cols = np.arange(windows.shape[1])[None, :]

# 相对坐标 + 窗口起始坐标 = 原数组绝对坐标(NumPy默认0-based索引)
abs_rows = rel_row + win_start_rows
abs_cols = rel_col + win_start_cols

# 如果需要你示例中使用的1-based索引,取消下面两行注释即可
# abs_rows += 1
# abs_cols += 1

结果说明

运行代码后得到的abs_rows和abs_cols和window_max形状完全一致,对应位置的元素就是每个最大值在原数组的行、列坐标:

  • 自动满足「同一窗口存在多个最大值时仅返回第一个位置」的要求,因为argmax默认返回第一个匹配值的索引
  • 窗口大小可以任意调整,只需要修改win_h和win_w参数即可适配不同尺寸的滑动窗口
  • 计算逻辑对更高维的数组同样适用,只需要对应调整相对坐标的拆分维度即可

以你给出的测试数组为例,第一个窗口(输出矩阵左上角92)的0-based坐标为(0, 1),如果切换为1-based索引就是(1, 2),和数组实际存储位置完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:18:16