如何获取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
相关产品推荐
相关产品推荐

