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

如何无循环用索引范围从NumPy数组提取多个ROI?

解决NumPy多ROI向量化切片问题

错误原因

你遇到的TypeError是因为NumPy的切片语法仅支持标量或单个slice对象作为起止参数,直接传入数组类型的索引范围无法被解析为合法的切片规则。

向量化实现方案

观察你的ROI参数可知,所有ROI的尺寸统一(行范围长度都是5,列范围长度都是5),可以利用NumPy的广播机制生成所有ROI的索引矩阵,实现无循环的向量化切片:

完整代码示例

import numpy as np

# 初始化原数组
arr = np.ones((640, 480))

# 定义ROI的索引范围
u_min = np.array([497, 157, 493, 137, 567], dtype=np.int32)
u_max = np.array([502, 162, 498, 142, 572], dtype=np.int32)
v_min = np.array([36, 46, 208, 412, 418], dtype=np.int32)
v_max = np.array([41, 51, 213, 417, 423], dtype=np.int32)

# 计算单个ROI的尺寸
roi_h = u_max[0] - u_min[0]
roi_w = v_max[0] - v_min[0]

# 生成行、列的偏移量矩阵(利用广播扩展维度)
row_offsets = np.arange(roi_h)[None, :, None]  # shape: (1, roi_h, 1)
col_offsets = np.arange(roi_w)[None, None, :]  # shape: (1, 1, roi_w)

# 构建所有ROI的行、列索引矩阵
all_rows = u_min[:, None, None] + row_offsets  # shape: (5, roi_h, 1)
all_cols = v_min[:, None, None] + col_offsets  # shape: (5, 1, roi_w)

# 提取所有ROI,结果shape为(5, roi_h, roi_w)
rois = arr[all_rows, all_cols]

结果说明

最终rois是一个形状为(5, 5, 5)的数组,其中第i个元素rois[i]对应第i个ROI的5×5区域,完全符合你的需求,且全程无循环,属于纯向量化操作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:52:57