我怎样才能有效地翻译地形" numpy数组到networkx图?

时间:2015-10-15 19:51:14

标签: python arrays numpy data-structures graph

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

我可以构建图形G,手动迭代阵列A的元素并检查是否有连接区域(仅当像素具有共同边缘时才考虑连接,因此每个像素的区域最多可以连接到4,不允许对角连接。)

但这让我觉得效率低下并且是单声道的。我怎么能做得更好?

1 个答案:

答案 0 :(得分: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也接受一个布尔数组。)