基于相邻元素差值对列表分组并提取符合条件的分组起止索引
列表元素按相邻差值聚类分组实现
需求背景
完成数字图像变换后,提取出的孔洞中心数据存储在values列表中,提前计算得到相邻元素的差值数组diff_ar。需要按照规则对列表元素做聚类划分,最终输出所有符合要求的分组起始、结束索引构成的元组列表。
分组规则
- 同组内相邻元素的最大差值小于3
- 分组至少包含7个元素才判定为有效分组
示例参考数据
values = [73.0, 143.0, 323.0, 324.0, 325.0, 325.0, 325.0, 325.0, 325.5, 325.5, 326.0, 326.0, 326.0, 326.0, 406.0, 406.5, 432.5, 433.0, 433.5, 434.5, 435.0, 435.0, 436.0, 436.5, 437.5, 438.0] diff_ar = [70.0, 180.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.0, 80.0, 0.5, 26.0, 0.5, 0.5, 1.0, 0.5, 0.0, 1.0, 0.5, 1.0, 0.5] # 预期输出 expected_output = [(2,12),(16,24)]
实现代码
核心思路是遍历差值数组,记录当前分组的起始索引,遇到相邻差值大于等于3时就结束当前分组,校验分组长度是否符合要求,符合则存入结果,最后还要处理遍历结束后剩余的最后一个分组:
def get_valid_groups(diff_ar, min_group_len=7, max_adjacent_diff=3): valid_groups = [] diff_count = len(diff_ar) current_start = 0 for idx in range(diff_count): # 遇到差值超出阈值,断开当前分组 if diff_ar[idx] >= max_adjacent_diff: current_end = idx - 1 # 校验分组长度 if current_end - current_start + 1 >= min_group_len: valid_groups.append((current_start, current_end)) # 更新下一个分组的起始索引 current_start = idx + 1 # 处理遍历结束后剩余的最后一个分组 current_end = diff_count - 1 if current_end - current_start + 1 >= min_group_len: valid_groups.append((current_start, current_end)) return valid_groups # 测试调用 print(get_valid_groups(diff_ar)) # 输出:[(2, 12), (16, 24)]
代码说明
- 输入的
diff_ar长度为values长度减1,每个元素对应values中相邻两个元素的差值 - 代码默认配置了最小分组长度7、最大相邻差值3的参数,可根据需求自行调整
- 最终返回的元组中,两个值分别对应
values数组的起始、结束索引,均为闭区间
内容的提问来源于stack exchange,提问作者Slawek
相关产品推荐
相关产品推荐

