【问题标题】:Measure border overlap between numpy 2d regions测量 numpy 2d 区域之间的边界重叠
【发布时间】:2017-01-29 20:37:42
【问题描述】:

我有一个大的 numpy 2d (10000,10000) 有许多区域(具有相同单元格值的集群单元格)。我想要的是合并显示超过 35% 边界重叠的相邻区域。这种重叠应该通过将与邻居的公共边界的大小除以该区域的总边界大小来衡量。

我知道如何检测相邻区域 (Look here),但我不知道如何测量边界重叠。

当我使用大型数组时,矢量化解决方案将是最理想的。


示例

#input
region_arr=np.array([[1,1,3,3],[1,2,2,3],[2,2,4,4],[5,5,4,4]])

邻居检测脚本的输出是一个 numpy 二维数组,第一列是区域,第二列是邻居。

#result of neighbour detection
>>> region_neighbour=detect_neighbours(region_arr)
>>> region_neighbour
array([[1, 2],
       [1, 3],
       [2, 1],
       [2, 3],
       [2, 4],
       [2, 5],
       [3, 1],
       [3, 2],
       [3, 4],
       [4, 2],
       [4, 3],
       [4, 5],
       [5, 2],
       [5, 4]])

我想在邻居检测结果中添加一列,其中包含区域与其邻居之间的百分比重叠。 区域 1 和 3 之间的重叠百分比 = 1/8 = 0.125 = 区域 1 的共同边界大小/总边界大小。

在此示例中,所需的输出如下所示:

#output
>>> percentual_overlap=measure_border_overlap(region_arr,region_neighbour)
>>> percentual_overlap
array([[ 1.       ,  3.       ,  0.125   ],
       [ 1.       ,  2.       ,  0.375   ],
       [ 2.       ,  1.       ,  0.3     ],
       [ 2.       ,  3.       ,  0.3     ],
       [ 2.       ,  4.       ,  0.2     ],
       [ 2.       ,  5.       ,  0.2     ],
       [ 3.       ,  1.       ,  0.125   ],
       [ 3.       ,  2.       ,  0.25    ],
       [ 3.       ,  4.       ,  0.125   ],
       [ 4.       ,  2.       ,  0.375   ],
       [ 4.       ,  3.       ,  0.125   ],
       [ 4.       ,  5.       ,  0.125   ],
       [ 5.       ,  2.       ,  0.333333],
       [ 5.       ,  4.       ,  0.166667]])       

使用此输出,合并重叠超过 35% 的区域(区域 1 和 2;区域 4 和 2)相对容易。区域合并后新数组将如下所示:

编辑

您可以通过应用pv.的函数来计算每个区域的周长。

【问题讨论】:

    标签: python arrays numpy multidimensional-array vectorization


    【解决方案1】:

    看看这个Count cells of adjacent numpy regions 以获得灵感。我认为根据这些信息决定如何合并是一个有多个答案的问题;根据您进行的顺序,它可能没有唯一的解决方案...

    import numpy_indexed as npi
    
    neighbors = np.concatenate([x[:, :-1].flatten(), x[:, +1:].flatten(), x[+1:, :].flatten(), x[:-1, :].flatten()])
    centers   = np.concatenate([x[:, +1:].flatten(), x[:, :-1].flatten(), x[:-1, :].flatten(), x[+1:, :].flatten()])
    border = neighbors != centers
    
    (neighbors, centers), counts  = npi.count((neighbors[border], centers[border]))
    region_group = group_by(centers)
    regions, neighbors_per_region = region_group.sum(counts)
    fractions = counts / neighbors_per_region[region_group.inverse]
    for result in zip(centers, neighbors, fractions): 
        print(result)
    

    【讨论】:

    • 非常感谢。输出确实不完全相似,但我绝对可以在我的代码中实现这种方法!
    • 这个答案的一个小错误是返回的分数是整数(都是0)。我认为它应该是这样的:fractions = counts / neighbors_per_region[region_group.inverse].astype(float)
    • 是的;它在 python3 下工作,但实际上我认为这在 2 中有所不同
    猜你喜欢
    • 2017-07-07
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2021-06-25
    • 2011-05-12
    相关资源
    最近更新 更多