2016-04-24 82 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位有错误! –