2016-04-24 83 views
0

我有兩個不同的圖:g1和g2。我想將它們加在一起並創建一些邊緣。爲什麼這不起作用?igraph中的add_edge導致自我循環而不是新的邊緣

import igraph 

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

    return g 

我需要try/exception,因爲一個圖沒有get_tutor_id()方法。 我也試過

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 

然後,它的工作原理,而是添加的邊緣從v到W,它增加了一個自我循環,以訴 任何想法?欣賞它

回答

1

第二個示例不起作用,因爲w是來自g2的頂點,而您試圖在g中添加邊緣。 igraph返回的頂點對象實際上只是頂點索引的代理,因此當您運行g.add_edge(v, w)時,igraph將簡單檢索vwindex屬性,然後基本上運行g.add_edge(v.index, w.index),這在g的上下文中沒有意義(因爲指數分別指g1g2)。

至於第一個例子,你需要提供更多的信息;例如,頂點屬性包含什麼name

+0

「name」包含我添加的python類對象的所有方法。我也發現(從昨天開始有很多想法),當我添加兩個圖表(不相同)時,我失去了所有的屬性(如「name」)。我在網上找不到很多答案/幫助。他們大部分都是關於R的igraph。我應該嘗試使用networkx嗎?謝謝, –

+0

正如我所理解的那樣,'name'將該節點作爲一個可以訪問其所有原始方法和變量的python對象來維護,對嗎? –

+0

我的意思是,在示例2中,我調試了一下,發現條件子句被正確檢查。只是add_edge位有錯誤! –