2015-10-15 88 views
0

我有一个2d布尔numpy数组A.每个元素是地图的一个像素,True对应于地形,False对应于水。说,我想检查我有多少不同的大洲,所以我想要使用networx.number_connected_components(G)如何有效地将“terrain”numpy数组转换为networkx图?

我可以建立图G手动迭代数组A的元素,并检查是否连接的片断或不是(像素仅在具有共同边缘时才被认为是连接的,因此每个像素的最多可以连接到4,并且不允许对角线连接)。

但是这样做会让我感到效率低下,不宽松。我该如何做得更好?

回答

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还接受一个布尔阵列。)

相关问题