web-dev-qa-db-ja.com

Networkx:マルチグラフを重み付きエッジを持つ単純なグラフに変換します

マルチグラフオブジェクトがあり、それを重み付きエッジを持つ単純なグラフオブジェクトに変換したいと思います。 networkxのドキュメントを調べましたが、これを実現するための組み込み関数が見つからないようです。この目標を達成できるnetworkxの組み込み関数を誰かが知っているかどうか疑問に思っていました。 to_directed()、to_undirected()関数を見ましたが、それらは私の目標を果たしていません。

22
anonuser0428

重みを合計することにより、重み付きマルチグラフから重み付きグラフを作成する1つの方法を次に示します。

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

これを行う非常に簡単な方法の1つは、マルチグラフを入力として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)

これにより、マルチグラフの無向グラフが作成され、複数のエッジが1つのエッジにマージされます。ただし、マージされるエッジに異なる属性がある場合、どの属性が保持されるかを決定する方法があるかどうかはわかりません。

21
Maehler