聚类热图中低数值区域的方块与条纹模式检测方法咨询
识别聚类热图低数值区域的方块/条纹模式
核心思路
先通过阈值规则生成低数值区域的二进制掩码,再分析区域的形状特征(宽高比)来区分方块或条纹模式。
步骤1:生成低数值区域掩码
根据需求选择阈值方式,将低于阈值的单元格标记为目标区域:
import numpy as np # 替换为你的聚类热图矩阵(二维numpy数组) matrix = np.random.rand(50, 50) # 示例随机矩阵 # 二选一设置阈值 # 方式1:固定阈值0.5 threshold = 0.5 # 方式2:整体分布第10百分位 threshold = np.percentile(matrix, 10) # 生成二进制掩码,True表示低数值目标区域 mask = matrix < threshold
步骤2:分析连通区域的形状特征
用scipy.ndimage提取连通区域,通过计算区域最小外接矩形的宽高比判断模式:
from scipy.ndimage import label, find_objects # 标记连通区域(默认4邻域:上下左右;需8邻域则添加structure=np.ones((3,3))) labeled_mask, num_regions = label(mask) # 遍历每个连通区域判断模式 for region_idx in range(1, num_regions + 1): # 获取区域的边界框(行范围、列范围) bbox = find_objects(labeled_mask == region_idx)[0] # 计算区域的高度(行数)和宽度(列数) region_h = bbox[0].stop - bbox[0].start region_w = bbox[1].stop - bbox[1].start # 计算宽高比(避免除零) aspect_ratio = region_w / region_h if region_h != 0 else 0 # 根据宽高比判断模式(阈值可根据数据调整) if 0.8 <= aspect_ratio <= 1.2: print(f"区域{region_idx}:方块模式") elif aspect_ratio > 3: print(f"区域{region_idx}:横向条纹模式") elif aspect_ratio < 1/3: print(f"区域{region_idx}:纵向条纹模式") else: print(f"区域{region_idx}:过渡/不规则模式")
补充说明
- 连通区域的邻域规则可按需调整:4邻域仅识别上下左右连通的区域,8邻域包含对角线连通的区域
- 宽高比的阈值(0.8-1.2、3、1/3)可根据你的实际数据分布灵活修改,比如窄条纹可将阈值设为5或1/5
- 若存在多个分散的低数值区域,上述代码会逐个判断每个区域的模式
内容的提问来源于stack exchange,提问作者Damiano Tosolini
相关产品推荐
相关产品推荐

