2013-10-14 53 views
0

我有一个图形G1与50个节点和100个边缘。所有的边都是加权的。我创建边的列表(按预先定义的顺序进行排序,删除与大值的特定边缘),它们被编入索引,如:iGraph Python,将边缘列表转换为元组和add.edges

Edgelist: [75, 35, 32, 1, ...] 

我想边缘添加到批次不同的图表G2 10(节省计算时间),但add.edges似乎想要一个顶点对的元组列表。所以,

1)如何将上面的边缘列表转换成元组列表,例如[(40,2),(10,1),(10,11),(0,0),...]。我已经尝试了使用G1.es [edge] .tuple的循环,但是iGraph将[edge]变量作为属性读取,而如果您只是编写G1.es [75] .tuple,则它工作正常。

2)如何从G1中查找权重并将它们分别添加到G2中,批量为10?

谢谢

+0

是 “新锐榜” 上面提到G1边缘ID列表? –

+0

是的。我在下面发布了我的解决方案,但也许有一种加速它的方法? – user2524828

+0

我已经发布了一个可能的实现作为答案。 –

回答

0
  1. 添加边权以分批的方式实施例

    您必须注意,使用单个数字索引G1.es将返回Edge类型的对象,而使用数字列表索引它将返回EdgeSeq类型的对象。 Edge对象有一个名为tuple属性,但EdgeSeq对象不这样做,所以这就是为什么G1.es[edgelist].tuple不但是工作,你可以这样做:

    sorted_tuples = [edge.tuple for edge in G1.es[edgelist]] 
    

    您也可以提取weight的值直接从EdgeSeq属性对象:

    sorted_weights = G1.es[edgelist]["weight"] 
    
  2. 在这里,你可以利用的事实,如果G2具有M边和你加入M额外的边缘,那么这些新边的ID将是从M(含)的范围内到M + m(不含usive):

    M = G2.ecount() 
    m = len(sorted_tuples) 
    G2.add_edges(sorted_tuples) 
    G2.es[M:(M+m)] = sorted_weights 
    
0

1)图G1已经有不需要的边被删除了。边缘列表是G1的边缘顺序。

tuple_list=[] 
for e in G1.es: 
    tuple_list.append(e.tuple) 

sorted_tuples=[tuple_list[i] for i in Edgelist] 
sorted_weights = [G1.es['weight'][o] for o in Edgelist] 

2)添加边缘 - 这可以简单地为G1中的所有边缘循环。下面对第一10.

edges_to_add=sorted_tuples[0:10] 
weights_to_add=sorted_weights[0:10] 

G2.add_edges(edges_to_add) 

for edge in range(len(edges_to_add)): 
    G2.es[G2.get_eid(edges_to_add[edge][0],edges_to_add[edge][1],0)]['weight'] = weights_to_add[edge] 

边缘权重是分别加入,这是一个有点慢,但似乎没有要在IGRAPH