无法添加边缘,IGraph中的顶点ID无效

时间:2012-04-07 14:21:55

标签: python igraph

我试图使用igraph在python中编写代码,当我尝试使用while循环添加边缘时出现此错误

while(i<k)
  g.add_vertices(theInts[i])
  i=i+1
  g.add_edges([(theInts[i-1],theInts[i])])

我认为索引可能是一个问题所以我还包括一个if语句,但这似乎不是问题。

请帮助!!!

1 个答案:

答案 0 :(得分:4)

我认为这完全取决于g对顶点的影响。如果您从空g开始,则只有顶点0,因此,如果您尝试使用两个不同的顶点调用add_edges,则它无法正常工作。你必须添加一些顶点。当然,这完全取决于你的图形在循环之前的样子,以及i是什么。

您可以使用print显示有关图表的一些简要信息。例如,

>>> import igraph
>>> graph = igraph.Graph()
>>> print graph
Undirected graph (|V| = 1, |E| = 0)

如果i从0开始,那么您不会在第一次使用循环添加任何顶点。因此,当您尝试添加边时,您尝试添加到不存在的顶点。

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

如果这不是问题,请尝试打印边缘,看看它们是否符合您的要求。

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

此外,拥有完整的TraceBack可能会更有帮助。

编辑:根据您的评论

所以你说你有这样的结构:

>>> graph = igraph.Graph()
>>> print graph
Undirected graph (|V| = 1, |E| = 0)

你想只添加顶点2吗?我不确定你能用igraph做到这一点。它似乎必须按顺序排列每个顶点。您可以检查是否有顶点,然后根据需要添加它们,记住这些图形是从0开始的。这样的事情。

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

或者,如果您不喜欢地图,可以将其循环播放。

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

虽然可能有更好的方法。如果这不是您想要的,请更详细地编辑原始问题,以及一些实际代码。