2017-10-19 4 views
0

Gibt es eine Möglichkeit, einen Datensatz bestehend aus Paaren von 3D-Punkten (oder nur deren Indexnummern) in verbundene Cluster aufzuteilen? Das heißt, zwei Paare (a, b) und (c, d) sollten sich im selben Cluster befinden, wenn sie einen gemeinsamen Punkt teilen (dh a = c, b = c, a = d oder b = d) oder falls vorhanden eine Kette von einem oder mehreren anderen Paaren, von denen jedes einen gemeinsamen Punkt mit dem vorherigen hat, von einem Paar zum anderen.Clustering durch wiederholte Daten

Zum Beispiel kann die Liste von Paaren:

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

würde wie folgt zusammengefasst werden:

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

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

im ersten Cluster, die die Paare (1,2) und (2,3) habe den Punkt 2 gemeinsam und teile keine Punkte mit Paaren außerhalb des Clusters. Im zweiten Cluster teilt das Paar (4,5) gemeinsame Punkte mit (9,4) und (8,5), während (8,5) einen gemeinsamen Punkt mit (7,8) hat, der einen gemeinsamen Punkt hat mit (6,7).

Die Daten werden ursprünglich in einem Array gespeichert, aber das Ausgabeformat ist nicht so wichtig.

Ich muss in der Lage sein, auf die Daten zuzugreifen, die jeden einzelnen Cluster danach bilden.

+2

ich nicht die Logik der Gruppierung verstehen. Wenn "[1,2], [2,3]" in einem Cluster ist, warum ist dann nicht auch [6,7], [7,8] in diesem oder seinem eigenen Cluster? Was meinst du mit "wiederholten Punkten"? – roganjosh

+1

@roganjosh Ich denke, das Problem kann ausgedrückt werden als die verbundenen Komponenten eines Graphen zu finden, wo die gegebenen Paare Kanten sind und die Zahlen sind Knoten. OP, check out Netzwerkx. –

+0

@AlexHall diese Erklärung wird leider nicht durch die zufällige Bearbeitung geholfen, um Kommentare (nicht von der OP oder Ihnen) zu der Frage hinzuzufügen. Aber sollte ich die erforderliche Ausgabe so interpretieren, dass sie einen Bruch in einem Verbindungsgraphen identifiziert und den Rest auf eine andere Liste legt? "[6,7], [7,8]" ist immer noch verbunden, aber es erscheint mit dem Rest. – roganjosh

Antwort

2

Mit 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))) 

Ausgang:

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

Bin gerade über networkx gestolpert. Vielen Dank für Ihr gelungenes Beispiel. –

Verwandte Themen