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

Python 无法添加边,IGraph中的顶点ID无效,python,igraph,Python,Igraph,我试图使用igraph用python编写代码,当我试图使用while循环添加边时,出现了这个错误 while(i<k) g.add_vertices(theInts[i]) i=i+1 g.add_edges([(theInts[i-1],theInts[i])]) while(我我认为这一切都取决于g对顶点有什么。如果你从一个空的g开始,你只有顶点0,所以如果你试图用两个不同的顶点调用添加边,它就不会起作用。你必须添加更多的顶点。当然,这一切都取决于你的gr是什么aph看起

我试图使用igraph用python编写代码,当我试图使用while循环添加边时,出现了这个错误

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

while(我我认为这一切都取决于
g
对顶点有什么。如果你从一个空的
g
开始,你只有顶点
0
,所以如果你试图用两个不同的顶点调用
添加边,它就不会起作用。你必须添加更多的顶点。当然,这一切都取决于你的gr是什么aph看起来像在循环之前,什么是
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
你想只添加顶点2吗?我不确定你能用IGRAPHE做到这一点。似乎每个顶点都必须按顺序排列。你可以检查是否有顶点,然后在必要时添加它们,记住这些图是基于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)]
>顶点=1,2,13,4,21,5
>>>map\u graph=igraph.graph()
>>>打印地图
无向图(| V |=1,| E |=0)
>>>映射图。添加顶点(最大(顶点))
>>>打印地图
无向图(| V |=22,| E |=0)
>>>映射(map_graph.add_边,zip(顶点,顶点[1:]))
[, , ]
>>>打印地图
无向图(| V |=22,| E |=5)
>>>映射图。获取边列表()
[(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)]
>顶点=1,2,13,4,21,5
>>>loop_graph=igraph.graph()
>>>打印循环图
无向图(| V |=1,| E |=0)
>>>循环图。添加顶点(最大(顶点))
>>>打印循环图
无向图(| V |=22,| E |=0)
>>>对于拉链中的成对(顶点,顶点[1:]):
…循环图。添加边(对)
... 
>>>打印循环图
无向图(| V |=22,| E |=5)
>>>循环图。获取边列表()
[(1, 2), (2, 13), (4, 13), (4, 21), (5, 21)]

不过,可能有更好的方法可以做到这一点。如果这不是你想要的,请用更详细的信息和一些实际的代码编辑你的原始问题。

我认为这一切都取决于
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
你想只添加顶点2吗?我不确定你能用IGRAPHE做到这一点。似乎每个顶点都必须按顺序排列。你可以检查是否有顶点,然后在必要时添加它们,记住这些图是基于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)]
>顶点=1,2,13,4,21,5
>>>map\u graph=igraph.graph()
>>>打印地图
无向图(| V |=1,| E |=0)
>>>映射图。添加顶点(最大(顶点))
>>>打印地图
无向图(| V |=22,| E |=0)
>>>映射(map_graph.add_边,zip(顶点,顶点[1:]))
[, , ]
>>>打印地图
无向图(| V |=22,| E |=5)
>>>映射图。获取边列表()
[(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)]
>顶点=1,2,13,4,21,5
>>>loop_graph=igraph.graph()
>>>打印循环图
无向图(| V |=1,| E |=0)
>>>循环图。添加顶点(最大(顶点))
>>>打印循环图
无向图(| V |=22,| E |=0)
>>>对于拉链中的成对(顶点,顶点[1:]):
…循环图。添加边(对)
... 
>>>打印循环图
无向图(| V |=22,| E |=5)
>>>循环图。获取边列表()
[(1, 2), (2, 13), (4, 13), (4, 21), (5, 21)]

不过,可能还有更好的方法。如果这不是您想要的,请编辑您的原始问题,并提供更多详细信息和一些实际代码。

进入循环之前,
i
k
的值是什么?进入循环之前,
i
k
的值是什么?实际上我是执行g.add_顶点(vertice[i]),当vertice[i]的值=2然后它将添加2个顶点,但我想添加一个名为2的顶点。请在此方面提供帮助!@Fyre,我不确定我的编辑是否回答了您的问题。如果没有回答,也许您可以在原始问题中提供更多详细信息。感谢Confib的回复。但实际上我想说的是,是否可以添加一个名为21?的顶点例如,当您添加21时,它在先前的顶点数上添加了21,但我要做的是将21设为顶点数,将顶点总数设为2。igraph通过从0到N-1的数字标识顶点,其中N是顶点数。添加顶点后,可以将名称作为顶点属性附加到顶点上;例如,您可以使用c您可以说
graph.vs[2][“name”]=“spam”
将名称
“spam”
分配给id=2的顶点。或者您可以说:
graph.add_顶点(1);graph.vs[0][“name”]=“21”
将单个顶点添加到空图中,然后将其命名为
21
,但您以后必须使用其id而不是名称来引用它(除非你维护一个将顶点名称映射回ID的字典)。有没有什么方法可以让我找出哪个边包含哪个顶点,就像我试图在我的图中检测循环一样,我想看看那个边是否包含两个给定的顶点,这样我就可以给它们上色了