2015-04-21 51 views
3

最近我一直在使用python-igraph軟件包,我所有的代碼都是基於使用igraph創建的圖。現在,我需要爲我的圖計算一些度量,這些度量顯然在networkx中實現,而不是在圖中實現,如(katz_centrality_numpy,edge_betweenness_centrality,...)。我想知道是否有辦法在這兩個包之間將一個圖轉換爲另一個圖,並且避免再次從文件讀取,因爲我的文件很大並且必須重複相同的過程。將python-igraph圖轉換爲networkx

順便說一句,當我經過的igraph圖形到networkx功能我收到以下錯誤:

TypeError: 'Graph' object is not iterable 

謝謝:)

+0

你可以創建一個新的networkx圖形 - 只需要igraph的邊緣並用它們生成一個networkx圖形 –

+0

@EllaShar任何想法networkx中有什麼方法可以做到這一點? – ahajib

回答

3

您可以啓動networkx圖與邊緣:

Graph([(1,2), (3,4)]) 

請參閱the documentation

編輯:

這是如何使用它(謝謝你nimafl的代碼):

igraph圖中,我們創建G這是一個networkx圖。

import networkx 
A = graph.get_edgelist() 
G = networkx.DiGraph(A) # In case your graph is directed 
G = networkx.Graph(A) # In case you graph is undirected 
+0

感謝Ella,這幫助我弄清楚瞭如何解決我的問題:) – ahajib

0

好吧,我想出了自己。這是你應該做的。假設你的python.igraph對象稱爲圖形,我們創建一個networkx圖稱爲圖G如下:

import networkx as netx 

A = [edge.tuple for edge in graph.es] 
# In case your graph is directed 
G = netx.DiGraph(A) 
# In case you graph is undirected 
G = netx.Graph(A) 

graph.es返回圖形邊緣列表,然後所有的人都加入到A和使用矩陣A,我們創建一個graph在網絡x。

祝你的代碼:)

+1

您可以簡單地編寫'graph.get_edgelist()' - 它可能不是寫''[edge.tuple for graph.es]稍微快一點。 –

1

當我嘗試存儲節點的名稱/雙方的igraph或NX的邊緣,這是我的一行代碼版本,也傳送節點的名稱,而從IGRAPH對象轉移,g ,與nx,G,結果:

G = nx.from_edgelist([(names[x[0]], names[x[1]]) 
         for names in [g.vs['name']] # simply a let 
         for x in g.get_edgelist()], nx.DiGraph()) 

此外,如果您需要相反的方式,看看this answer