networkx中的内置函数是否可以将加权有向图更改为无向图?功能应将两个有向边(n1,n2,5)和(n2,n1,7)更改为一个(n1,n2,12)。
我搜索了很长时间,但没有资助一次。
答案 0 :(得分:0)
Networkx具有to_undirected函数,但它不对权重求和,它只是使用原始图形中最后找到的边缘权重来更新权重:
如果图形中同时存在两个方向(u,v)和(v,u)的边,则新的无向边的属性将是有向边的属性的组合。边缘数据以遇到边缘的(任意)顺序更新。要对边缘属性进行更多的自定义控制,请使用add_edge()。
您应该像这样手动进行操作:
G = nx.DiGraph()
G.add_weighted_edges_from([
(1,2,3),
(1,3,4),
(2,1,5),
(2,3,1),
(3,2,2)
])
UG = G.to_undirected()
for node in G:
for ngbr in nx.neighbors(G, node):
if node in nx.neighbors(G, ngbr):
UG.edges[node, ngbr]['weight'] = (
G.edges[node, ngbr]['weight'] + G.edges[ngbr, node]['weight']
)
UG.edges.data('weight')
将返回汇总的权重:
EdgeDataView([(1, 2, 8), (1, 3, 4), (2, 3, 3)])