[英]iGraph Python, convert edge list to tuple and add.edges
我有一个具有50个节点和100条边的图G1。 所有边缘均加权。 我创建了一个边缘列表(按预定义顺序排序,删除具有大值的特定边缘),它们的索引如下:
Edgelist: [75, 35, 32, 1, ...]
我想以10为批次将边添加到不同的图形G2中(以节省计算时间),但是add.edges似乎想要一个顶点对的元组列表。 所以,
如何将上面的Edge列表转换为元组列表,例如[(40,2),(10,1),(10,11),(0,0),...]。 我已经尝试过使用G1.es [edge] .tuple进行循环,但是iGraph会将[edge]变量作为属性读取,而如果您只编写G1.es [75] .tuple,它就可以正常工作。
如何从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中成批添加边缘权重
您必须注意,用单个数字索引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"]
在这里,您可以利用以下事实:如果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.