2017-10-19 121 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。谢谢你为你工作的例子。 –