2013-03-23 60 views
10

我有一個多圖形對象,並希望將其轉換爲具有加權邊的簡單圖形對象。我查看了networkx文檔,似乎無法找到實現此功能的內置函數。我只是想知道是否有人知道networkx中的內置函數可以實現這個目標。我查看了to_directed(),to_undirected()函數,但它們不符合我的目標。Networkx:將多幅圖轉換爲具有加權邊的簡單圖形

+0

是否有多重圖加權邊緣?如果是這樣,你是否想要以某種方式組合來自並行邊的權重來構建圖? – Aric 2013-03-23 23:41:43

+0

是的,就是這樣的情況。 – anonuser0428 2013-03-23 23:56:39

回答

14

這裏是由權重相加,以創建加權多圖加權圖的一種方法:

import networkx as nx 
# weighted MultiGraph 
M = nx.MultiGraph() 
M.add_edge(1,2,weight=7) 
M.add_edge(1,2,weight=19) 
M.add_edge(2,3,weight=42) 

# create weighted graph from M 
G = nx.Graph() 
for u,v,data in M.edges(data=True): 
    w = data['weight'] if 'weight' in data else 1.0 
    if G.has_edge(u,v): 
     G[u][v]['weight'] += w 
    else: 
     G.add_edge(u, v, weight=w) 

print(G.edges(data=True)) 
# [(1, 2, {'weight': 26}), (2, 3, {'weight': 42})] 
+0

這是一個很好的解決方案,幾乎正是我所期待的,除了我的MultiGraph在邊緣沒有「重量」屬性。我建議對你的代碼進行小小的更新,所以如果沒有這樣的屬性,它將權重默認爲1.0。 – 2017-02-13 13:33:49

10

這樣做的一個非常簡單的方法就是將多個圖作爲輸入傳遞給Graph

import networkx as nx 

G = nx.MultiGraph() 
G.add_nodes_from([1,2,3]) 
G.add_edges_from([(1, 2), (1, 2), (1, 3), (2, 3), (2, 3)]) 

G2 = nx.Graph(G) 

這將創建多圖的無向圖,其中多條邊合併爲單條邊。但是,如果您對合並邊緣有不同的屬性,我不知道是否有任何方法來確定保留哪個屬性。

+0

知道MultiGraph可以很容易地轉換成圖形是非常有用的,但它不能解決OP對加權邊緣的要求。 – TheEspinosa 2017-07-19 15:07:31