2013-03-23 67 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