2012-04-07 68 views
1

我試圖用的igraph到用Python語言編寫的代碼添加邊緣,無效的頂點ID,當我嘗試添加使用while循環邊這一錯誤想出了不能在IGRAPH

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

我認爲索引可能是一個問題,所以我還包括一個if語句,但這似乎不成問題。

請幫忙!!!

+0

進入循環之前'i'和'k'的值是多少? – Mahesh 2012-04-07 14:23:43

回答

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

雖然可能有更好的方法。如果這不是你想要的,請更詳細地編輯你的原始問題,以及一些實際的代碼。

+0

實際上我在做g.add_vertices(vertice [i]),它不會給我正確的結果,因爲當vertice [i] = 2時它的值增加了2個頂點,但我想要的是添加名稱2的頂點請幫助這個! – Fyre 2012-04-07 18:44:34

+0

@Fyre,我不確定我的編輯是否回答你的問題。也許你可以在你原來的問題中提供更多的細節,如果它不。 – confab 2012-04-07 21:00:05

+0

非常感謝您的回覆。但是我實際上在說什麼,可以添加一個名爲21的頂點?在這種情況下,當您添加21時,它將21添加到以前的頂點數量,但我想要做的是將21作爲頂點並將頂點總數設置爲2. – Fyre 2012-04-08 02:08:30