2017-10-19 170 views
0

有沒有辦法將包含3D點對(或其索引號)的數據集拆分爲連接的集羣?也就是說,如果兩個對(a,b)和(c,d)共享一個公共點(即a = c,b = c,a = d或b = d),或者如果存在一個或多個其他對的鏈,每一對都與前一個共同點,從一對到另一對。通過重複數據進行聚類

例如,對列表:

[[1,2],[2,3],[4,5],[6,7],[7,8],[9,4],[8,5]] 

將被分組如下:

[[1,2],[2,3]] 

[[4,5],[6,7],[7,8],[9,4],[8,5]] 

在第一簇中,對(1,2)和(2,3)具有共同點2,並且不與羣外的任何對共享點。在第二類中,這對(4,5)與(9,4)和(8,5)共有點,而(8,5)與(7,8)有一個共同點,它有一個共同點與(6,7)。

數據最初存儲在一個numpy數組中,但輸出格式不是太重要。

我需要能夠訪問組成每個單個羣集的數據。

+2

我無法理解的分組的邏輯。如果'[1,2],[2,3]'在一個集羣中,那麼爲什麼不是[6,7],[7,8]'也是它自己的集羣呢? 「重複點」是什麼意思? – roganjosh

+1

@roganjosh我認爲這個問題可以表示爲查找圖的連通分量,其中給定對是邊並且數是節點。 OP,退出networkx。 –

+0

@Alex不幸的是,這個解釋並沒有被隨機編輯幫助添加註釋(而不是由OP或你)來解決這個問題。但即便如此,我是否需要將輸出解釋爲識別連接圖中的中斷,然後將其餘部分轉儲到另一個列表中? '[6,7],[7,8]'仍然存在,但它與其餘部分一起出現。 – roganjosh

回答

2

使用networkx

import networkx 

edges = [[1, 2], [2, 3], [4, 5], [6, 7], [7, 8], [9, 4], [8, 5]] 

graph = networkx.Graph(edges) 
print(list(networkx.connected_components(graph))) 

輸出:

[set([1, 2, 3]), set([4, 5, 6, 7, 8, 9])] 
+0

只是偶然發現了自己的networkx。謝謝你爲你工作的例子。 –