2015-10-15 80 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還接受一個布爾陣列。)

相關問題