2016-04-24 18 views
0

Ich habe zwei verschiedene Graphen: g1 und g2. Ich möchte sie zusammenfügen und einige Kanten erstellen. Warum funktioniert das nicht?add_edge in igraph, was zu einer Selbstschleife anstelle einer neuen Kante führt

Ich brauche die versuchen/Ausnahme, weil ein Diagramm nicht die get_tutor_id() -Methode hat. Ich habe auch versucht

def edging_up(g1, g2): 
    g = g1 + g2 
    for v in g1.vs: 
     for w in g2.vs: 
      if v['name'].get_researcher_id() == w['name'].get_tutor_id(): 
        g.add_edge(v, w) 
    return g 

Dann es funktioniert, sondern eine Kante des Hinzufügens von v nach w, fügt es eine Selbstschleife v. Irgendwelche Ideen? Schätzen Sie es

Antwort

1

Das zweite Beispiel funktioniert nicht, da w ein Vertex von g2 ist, und Sie versuchen, eine Kante in g hinzuzufügen. Die Vertex-Objekte, die Renditen IGRAPH sind tatsächlich einfach Proxies Vertex-Indizes, so dass, wenn Sie g.add_edge(v, w) ausführen, wird IGRAPH einfach abrufen das index Attribut v und w und führt im Wesentlichen g.add_edge(v.index, w.index), der Sinn macht, nicht im Zusammenhang mit dem g (weil der Indizes beziehen sich auf bzw. g2).

Wie beim ersten Beispiel müssen Sie weitere Informationen bereitstellen; Was zum Beispiel enthält das Vertex-Attribut name?

+0

'' name'' enthält alle Methoden des Python-Klassenobjekts, das ich hinzugefügt habe. Ich habe auch herausgefunden (viel Denken seit gestern), dass wenn ich zwei Graphen (die nicht identisch sind) hinzufüge ich alle Attribute (wie "Name") verliere. Und ich konnte nicht viele Antworten/Hilfe im Internet finden. Meist handelt es sich um Inschriften in R. Soll ich networkx ausprobieren? Danke, –

+0

Wie ich es verstanden habe, behält 'name' den Knoten als ein Python-Objekt mit Zugriff auf alle seine ursprünglichen Methoden und Variablen, richtig? –

+0

Ich meine, in Beispiel 2, ich debugge und ich fand, dass die bedingte Klausel richtig überprüft wird. Nur das add_edge Bit ist fehlerhaft! –