Ich denke, das hängt davon ab, was g
für Vertices hat. Wenn Sie mit einem leeren g
beginnen, haben Sie nur den Vertex 0
, also wenn Sie versuchen, add_edges
mit zwei verschiedenen Vertices aufzurufen, wird es einfach nicht funktionieren. Sie müssen einige weitere Eckpunkte hinzufügen. Natürlich hängt das alles davon ab, wie Ihr Graph vor der Schleife aussieht und was i
ist.
Sie können einige kurze Informationen zu Ihrem Diagramm mit print
anzeigen. Zum Beispiel
>>> import igraph
>>> graph = igraph.Graph()
>>> print graph
Undirected graph (|V| = 1, |E| = 0)
Wenn i
beginnt bei 0, dann fügen Sie keine Ecken mit Schleife um das erste Mal. Wenn Sie also versuchen, Kanten hinzuzufügen, versuchen Sie, Scheitelpunkte hinzuzufügen, die nicht existieren.
>>> graph.add_vertices(0)
<igraph.Graph object at 0xcea850>
>>> print graph
Undirected graph (|V| = 1, |E| = 0)
>>> graph.add_edges([(0, 1)])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
igraph.core.InternalError: Error at type_indexededgelist.c:245: cannot add edges, Invalid vertex id
Wenn das nicht das Problem ist, versuchen Sie, die Kanten zu drucken und zu sehen, ob sie mit dem übereinstimmen, was Sie wollen.
>>> graph.add_vertices(5)
<igraph.Graph object at 0xcea850>
>>> print graph
Undirected graph (|V| = 6, |E| = 3)
>>> graph.add_edges([(1, 1), (2, 3), (3, 5)])
<igraph.Graph object at 0xcea850>
>>> graph.get_edgelist()
[(1, 1), (2, 3), (3, 5)]
Auch könnte es ein bisschen hilfreicher sein, die komplette TraceBack zu haben.
EDIT: Basierend auf Ihren Kommentar
Sie sind also sagen Sie eine Struktur wie dieses:
>>> graph = igraph.Graph()
>>> print graph
Undirected graph (|V| = 1, |E| = 0)
Und Sie wollen 2 nur Vertex hinzufügen? Ich bin mir nicht sicher, dass du das mit dem igraph machen kannst. Es scheint, dass jeder Scheitelpunkt in Ordnung sein muss. Sie können überprüfen, ob Sie den Scheitelpunkt haben, und sie dann bei Bedarf hinzufügen. Denken Sie daran, dass diese Diagramme 0-basiert sind. Etwas wie das.
>>> vertices = 1, 2, 13, 4, 21, 5
>>> map_graph = igraph.Graph()
>>> print map_graph
Undirected graph (|V| = 1, |E| = 0)
>>> map_graph.add_vertices(max(vertices))
<igraph.Graph object at 0xceaa50>
>>> print map_graph
Undirected graph (|V| = 22, |E| = 0)
>>> map(map_graph.add_edges, zip(vertices, vertices[1:]))
[<igraph.Graph object at 0xceaa50>, <igraph.Graph object at 0xceaa50>, <igraph.Graph object at 0xceaa50>, <igraph.Graph object at 0xceaa50>, <igraph.Graph object at 0xceaa50>]
>>> print map_graph
Undirected graph (|V| = 22, |E| = 5)
>>> map_graph.get_edgelist()
[(1, 2), (2, 13), (4, 13), (4, 21), (5, 21)]
Oder wenn Sie Karten nicht mögen, können Sie es loopen.
>>> vertices = 1, 2, 13, 4, 21, 5
>>> loop_graph = igraph.Graph()
>>> print loop_graph
Undirected graph (|V| = 1, |E| = 0)
>>> loop_graph.add_vertices(max(vertices))
<igraph.Graph object at 0xcea950>
>>> print loop_graph
Undirected graph (|V| = 22, |E| = 0)
>>> for pair in zip(vertices, vertices[1:]):
... loop_graph.add_edges(pair)
...
<igraph.Graph object at 0xcea950>
<igraph.Graph object at 0xcea950>
<igraph.Graph object at 0xcea950>
<igraph.Graph object at 0xcea950>
<igraph.Graph object at 0xcea950>
>>> print loop_graph
Undirected graph (|V| = 22, |E| = 5)
>>> loop_graph.get_edgelist()
[(1, 2), (2, 13), (4, 13), (4, 21), (5, 21)]
Es gibt wahrscheinlich einen besseren Weg, dies zu tun. Wenn dies nicht das ist, was Sie suchen, bearbeiten Sie bitte Ihre ursprüngliche Frage mit mehr Details und einigen tatsächlichen Code.
Was sind die Werte von "i" und "k" vor dem Eintritt in die Schleife? – Mahesh