2014-02-12 17 views
5

ich einen enormen Graph-Datensatz haben - sagen wir es so ist, aber auf einem viel größeren Level:Finding getrennten Graphen innerhalb eines Diagrammobjekt in NetworkX

1 -> 2 
3 -> 4 

1,2,3,4 sind Knoten und Die Pfeile sind gerichtete Kanten. Lassen Sie uns sagen, dass sie alle in einem einzigen Diagramm Objekt sind:

import networkx as nx 
G = nx.DiGraph() 
G.add_nodes_from([1,2,3,4]) 
G.add_edge(1,2) 
G.add_edge(3,4) 

ein Objekt wie dieses gegeben, die zwei Mini-Diagramme innerhalb eines Graphen hat, wie können wir jedes Mini-Diagramm herausziehen? Ich habe das Gefühl, dass es ein Wort dafür geben muss? Mein Endergebnis aussehen würde:

for mini_graph in G: 
    print mini_graph.nodes() 

... 
[1,2] 
[3,4] 
+1

Ich glaube, Sie können [ 'weakly_connected_component_subgraphs'] (http://networkx.github.io/documentation/latest/reference/generated/networkx.algorithms.components.weakly_connected.weakly_connected_component_subgraphs.html#networkx.algorithms.components. weakly_connecte.weakly_connected_component_subgraphs) und wenn ja, ist dies ein Duplikat davon: http://stackoverflow.com/questions/18643789/how-to-find-subgraphs-in-a-directed-graph-without-converting-to-undirected- graph – EdChum

+0

Auch verwandt: http://stackoverflow.com/questions/13914920/networkx-extract-the-smallest-connected-subgraph. Es hängt davon ab, wie Sie Untergraphen hier definieren – EdChum

Antwort

8

Wenn die Teile des Graphen wirklich disjunkt sind (wie pro Ihr kleines Beispiel), dann erwägen, die Subgraphen mit connected_component_subgraphs() extrahieren.

Dies funktioniert nur bei einem ungerichteten Graphen. Wenn Sie also einen gerichteten Graphen verwenden, müssen Sie zuerst in den ungerichteten Graphen umwandeln.

import networkx as nx 
G = nx.DiGraph() 
G.add_nodes_from([1,2,3,4]) 
G.add_edge(1,2) 
G.add_edge(3,4) 

# make an undirected copy of the digraph 
UG = G.to_undirected() 

# extract subgraphs 
sub_graphs = nx.connected_component_subgraphs(UG) 

for i, sg in enumerate(sub_graphs): 
    print "subgraph {} has {} nodes".format(i, sg.number_of_nodes()) 
    print "\tNodes:", sg.nodes(data=True) 
    print "\tEdges:", sg.edges() 

, die ergibt:

subgraph 1 has 2 nodes 
    Nodes: [(1, {}), (2, {})] 
    Edges: [(1, 2)] 
subgraph 1 has 2 nodes 
    Nodes: [(3, {}), (4, {})] 
    Edges: [(3, 4)] 

und Sie die Subgraphen Knoten Etiketten verwenden könnte auf Ihre Daten in der ursprünglichen Kurve zu arbeiten,

sg.nodes()[0] in G 
>>> True 

die von EdChum verknüpft Antwort Lesen, es scheint, dass weakly_connected_component_subgraphs() auf einem gerichteten Graphen arbeitet, aber es als ungerichtet behandelt, so könnte das Speichern der Kopie von entscheidender Bedeutung sein. Die Dokumente zu dieser und der zugehörigen Funktion weakly_connected_components() sind jedoch derzeit etwas dünn.