У меня есть файл с дублированными ребрами по уважительной причине.
Дублирование двунаправленное, то есть у меня есть A-> B несколько раз, но также B-> A, многократно.
Мне нужно нетто ребер , то есть добавить все A-> B и вычесть все B-> A. Результат должен быть либо A-> B, либо B-> A, ребро с положительными значениями, как у A-> B, должно быть B-> A.
Я начал с этого скрипта (находится здесь Networkx: преобразовать мультиграф в простой граф с взвешенными ребрами ), и он хорошо выполняет суммы всех A-> B, , но он также суммирует ребра от B-> A до A-> B,когда мне нужно это вычесть.
Исходный код
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})]
Затем я добавляю B-> A ребро
#trying to subtract from 1->2 edge above
M.add_edge(2,1,weight=26)
#reprocess entire calculations
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))
#results shows edge above added 26, not subtracted
#[(1, 2, {'weight': 52}), (2, 3, {'weight': 42})]