如何有效地将“terrain”numpy数组转换为networkx图?
问题描述:
我有一个2d布尔numpy数组A.每个元素是地图的一个像素,True对应于地形,False对应于水。说,我想检查我有多少不同的大洲,所以我想要使用networx.number_connected_components(G)如何有效地将“terrain”numpy数组转换为networkx图?
我可以建立图G手动迭代数组A的元素,并检查是否连接的片断或不是(像素仅在具有共同边缘时才被认为是连接的,因此每个像素的最多可以连接到4,并且不允许对角线连接)。
但是这样做会让我感到效率低下,不宽松。我该如何做得更好?
答
要识别并统计连接区域的数量,您可以使用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
还接受一个布尔阵列。)