Networkx:将多重图转换为带权重的简单图

32 投票
3 回答
25857 浏览
提问于 2025-04-17 20:04

我有一个多重图对象,想把它转换成一个简单图对象,并且边上要有权重。我查阅了networkx的文档,但找不到可以直接实现这个功能的内置函数。我想知道有没有人知道networkx里有没有这样的内置函数可以帮我实现这个目标。我看过to_directed()和to_undirected()这两个函数,但它们并不能满足我的需求。

3 个回答

-8

你可以使用igraph这个库。可以从这里下载Python的扩展模块:http://igraph.sourceforge.net/download.html

35

一种非常简单的方法就是把你的多重图作为输入传给 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)

这样会创建一个无向图,把多重图中的多条边合并成一条边。不过,如果你有不同的边属性被合并在一起,我就不太清楚有没有办法确定保留哪个属性。

33

这里有一种方法可以通过将权重相加,从一个带权的多重图创建一个带权图:

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})]

撰写回答