繁体   English   中英

iGraph Python,将边列表转换为元组并添加

[英]iGraph Python, convert edge list to tuple and add.edges

我有一个具有50个节点和100条边的图G1。 所有边缘均加权。 我创建了一个边缘列表(按预定义顺序排序,删除具有大值的特定边缘),它们的索引如下:

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

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

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

  2. 如何从G1查找权重并将其以10为批次添加到G2?

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中成批添加边缘权重

  1. 您必须注意,用单个数字索引G1.es将返回Edge类型的对象,而使用数字列表对其进行索引将返回EdgeSeq类型的对象。 Edge对象具有一个名为tuple的属性,而EdgeSeq对象则没有,因此这就是G1.es[edgelist].tuple不起作用的原因。但是,您可以这样做:

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

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

     sorted_weights = G1.es[edgelist]["weight"] 
  2. 在这里,您可以利用以下事实:如果G2具有M条边,并添加m条额外边,则这些新边的ID将在M(含)到M + m(不含)范围内:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM