【问题标题】:Connected components in a 2D array二维数组中的连接组件
【发布时间】:2020-05-19 16:12:54
【问题描述】:

假设我有一个背景值为 0 的大矩阵和其他值 > 0 的点,例如

array([[1, 2, 2, 1, 0, 0, 0, 0, 0],
       [4, 1, 0, 0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 5, 6, 7, 3, 0],
       [0, 0, 0, 4, 7, 3, 2, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0]])

现在,我将补丁定义为 连接 值 > 0 的点集。在此示例中,我们有 2 个补丁:一个位于左上角,一个位于中右位置。

我想用 Python 编写一个算法来查找补丁的数量(在本例中为 2)以及每个补丁中的最小值及其(它们的)坐标。似乎很难。我曾考虑过 K 均值或 Voronoi 图,但我不确定它们是否适合我的问题。我仍在考虑,但我很感激任何想法。谢谢。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    似乎您正在寻找数组的连接组件。我们可以使用skimage.measure.label 标记数组中的不同组件,并使用skimage.measure.regionprops 标记将给我们找到的组件的切片:

    from skimage.measure import label, regionprops
    
    a = np.array([[1, 2, 2, 1, 0, 0, 0, 0, 0],
                  [4, 1, 0, 0, 0, 1, 1, 0, 0],
                  [0, 0, 0, 0, 5, 6, 7, 3, 0],
                  [0, 0, 0, 4, 7, 3, 2, 1, 0],
                  [0, 0, 0, 0, 0, 0, 0, 0, 0]])
    
    l = label(a.clip(0,1))
    for s in regionprops(l):
        print(s.slice)
    #(slice(0, 2, None), slice(0, 4, None))
    #(slice(1, 4, None), slice(3, 8, None))
    

    请注意,您可以使用每个(x,y) 切片对象来索引a 中的相应边界框,例如,如果我们取最后一个切片:

    a[s.slice]
    array([[0, 0, 1, 1, 0],
           [0, 5, 6, 7, 3],
           [4, 7, 3, 2, 1]])
    

    您可以轻松地使用它来找到相应的最小值或感兴趣的统计数据。

    【讨论】:

    • 嗨。执行切片时出现此错误:错误消息:'_RegionProperties' 对象没有属性'切片'。你知道为什么会这样吗?如果有帮助,我正在使用 Python 2.7
    • 看起来你可能需要 python 3 然后@david
    • 欣赏。你认为 Python 2.7 仍有可能使用它吗?还是谢谢
    • 升级是我的建议 :) 否则请查看 scipy,这是我的另一篇帖子 stackoverflow.com/questions/57715252/…@david
    【解决方案2】:

    这是一个众所周知的问题:在无向图中查找连通分量。在这种情况下,将每个数字视为一个节点,并且相邻的数字(上、下、右、左)在图中它们之间有一条边。你可以使用 BFS 来解决这个问题。这个和随时可用的代码有各种资源。

    对于伪代码,请看: https://math.stackexchange.com/questions/2699333/finding-connected-components-in-a-graph-using-bfs

    【讨论】:

      猜你喜欢
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      相关资源
      最近更新 更多