【问题标题】:How can I efficiently translate "terrain" numpy array into networkx graph?如何有效地将“地形”numpy 数组转换为 networkx 图?
【发布时间】:2015-10-15 19:51:14
【问题描述】:

我有一个二维布尔 numpy 数组 A。每个元素都是地图的一个像素,True 对应于地形,False 对应于水。说,我想检查我有多少个不同的大陆,所以我想使用 networx.number_connected_components(G)

我可以构建图形 G 手动迭代数组 A 的元素并检查土地是否连接(像素只有在它们具有共同边时才被认为是连接的,因此土地的每个像素最多可以连接到4,并且不允许对角连接)。

但这让我觉得效率低下且不符合标准。我怎样才能做得更好?

【问题讨论】:

    标签: python arrays numpy data-structures graph


    【解决方案1】:

    要识别和计算连接区域的数量,您可以使用scipy.ndimage.measurements.label(因此您不需要networkx)。例如,

    In [73]: x
    Out[73]: 
    array([[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
           [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0],
           [0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1],
           [0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1],
           [0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1],
           [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1],
           [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]])
    
    In [74]: from scipy.ndimage.measurements import label
    
    In [75]: labeled_x, num_labels = label(x)
    
    In [76]: num_labels
    Out[76]: 8
    
    In [77]: labeled_x
    Out[77]: 
    array([[1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
           [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 1, 1, 1, 0, 2, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0],
           [0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0],
           [0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5],
           [0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 5],
           [0, 0, 0, 0, 0, 4, 0, 0, 6, 6, 0, 5],
           [0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 5],
           [0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0]], dtype=int32)
    

    (在示例中,x 是一个由 0 和 1 组成的数组,但label 也接受一个布尔数组。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2022-10-21
      • 2014-12-20
      • 1970-01-01
      相关资源
      最近更新 更多