基于Numpy向量化比较两个布尔数组,提取感兴趣区域的起始与左闭右开结束索引
基于Numpy向量化比较两个布尔数组,提取感兴趣区域的起始与左闭右开结束索引
针对你提出的这个用Numpy处理布尔数组、提取符合特定条件的感兴趣区域的问题,我先把核心需求和逻辑拆解清楚,再结合示例详细说明:
核心条件说明
要提取的感兴趣区域需要满足以下规则:
- 基础条件:区域内必须至少包含一个
is_overlap数组中值为True的行; - 可选扩展规则:在满足基础条件的前提下,可以将区域扩展到相邻的行(无论
is_overlap是True还是False),但需要同时满足:- 这些扩展的行是
is_incomplete数组中值为True的连续行; - 扩展后的整个区域的总行数 ≥ 设定的
max_n_rows; - 所有连续的
is_incomplete行区域会被合并到包含is_overlap=True的核心区域中。
- 这些扩展的行是
示例代码与预期结果
先看给定的示例数据和预期输出:
import numpy as np max_n_rows = 4 # 行索引: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 is_overlap = np.array([0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1], dtype=bool) is_incomplete = np.array([1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1], dtype=bool)
预期提取结果
# 区域索引: 0 1 2 3 4 region_of_interest_starts = np.array([1, 3, 9, 14, 16]) region_of_interest_ends_excl = np.array([2, 8, 13, 15, 17])
结果逐区域解释
我们逐个分析每个区域的由来:
- 区域0(起始1,结束2):
- 满足基础条件:包含
is_overlap[1] = True的行; - 不满足扩展条件:虽然
is_incomplete[0] = True,但如果扩展到第0行,整个区域只有2行,小于max_n_rows=4,因此不进行扩展,仅保留原核心行。
- 满足基础条件:包含
- 区域1(起始3,结束8):
- 满足基础条件:包含
is_overlap[4]和is_overlap[5]两个True行; - 满足扩展条件:扩展了
is_incomplete为True的第3、6、7行,整个区域从3到8(左闭右开)共5行,行数≥4,因此合并为一个大区域。
- 满足基础条件:包含
- 区域2(起始9,结束13):
- 满足基础条件:包含
is_overlap[9]和is_overlap[11]两个True行; - 满足扩展条件:中间的
is_incomplete[10] = True,加上后续的is_incomplete[12] = True,整个区域从9到13共4行,刚好等于max_n_rows=4,因此将分散的核心行和中间/后续的is_incomplete行合并为一个区域。
- 满足基础条件:包含
- 区域3(起始14,结束15)& 区域4(起始16,结束17):
- 各自满足基础条件:分别对应
is_overlap[14] = True和is_overlap[16] = True的行; - 不满足扩展条件:如果尝试将14、15、16行合并,总共有3行,小于
max_n_rows=4,因此无法合并,拆分为两个独立的小区域。
- 各自满足基础条件:分别对应
备注:内容来源于stack exchange,提问作者pierre_j
相关产品推荐
相关产品推荐

