2016-02-03 30 views
3

這個問題已經在github上提交,類似於6個月前,但由於它尚未修復,所以我想知道是否有快速修復,我缺少。根據頂點名稱執行圖的聯合Python igraph

我希望用他們的名字合併兩個圖表:

g1 = igraph.Graph() 
g2 = igraph.Graph() 

# add vertices 
g1.add_vertices(["A","B"]) 
g2.add_vertices(["B","C","D"]) 

for vertex in g1.vs: 
    print vertex.index 
0 
1 

for vertex in g2.vs: 
    print vertex.index 
0 
1 
2 

然而,當我完成了工會,IGRAPH使用頂點的ID,而不是名稱,所以我結束了三個頂點,而不是四個(如果它是基於名稱的話)。我想這是因爲B的索引0g2,它合併的g1。並且以類似的方式,的g2g1B合併。

g_union = igraph.Graph.union(g1,g2) 

g_union.vs['name'] # of course 
KeyError: 'Attribute does not exist' 

for vertex in g_union.vs: 
    print vertex.index 
0 
1 
2 

有關如何繞過此問題的任何想法?這是可能的,因爲它是在igraph的R實現中完成的。

+0

聯合名稱在igraph中還不支持(除非您願意自己編寫代碼)。 C核本身不支持基於頂點屬性的聯合。 R版本支持它,因爲有人在純R中爲它寫了一個函數。不幸的是,我最近很少花時間致力於igraph,所以我擔心你必須自己用Python來想出類似的函數。 –

+0

@Tamás感謝您的坦誠回答。我會嘗試看看我是否可以在Python中重現R函數,並在正面發佈時保持發佈。 – Antoine

+0

@Tamás我找不到你在github上提到的R函數。你會友善地指點我嗎?感謝您的時間 – Antoine

回答

0

只需製作一個新圖形,並按名稱添加頂點。當然,這會消除其他節點屬性,您還必須手動添加其他節點屬性。

g1 = igraph.Graph() 
g2 = igraph.Graph() 

# add vertices 
g1.add_vertices(["A","B"]) 
g2.add_vertices(["B","C","D"]) 

g3 = igraph.Graph() 
verts_to_add = [] 
for v in g1.vs: 
    if v['name'] not in verts_to_add: 
     verts_to_add.append(v['name']) 
for v in g2.vs: 
    if v['name'] not in verts_to_add: 
     verts_to_add.append(v['name']) 

g3.add_vertices(verts_to_add) 

for v in g3.vs: 
    print(v['name']) 

#A 
#B 
#C 
#D