如何无循环用索引范围从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
相关产品推荐
相关产品推荐

