[英]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.