Ich habe ein Multigraph-Objekt und möchte es in ein einfaches Graphenobjekt mit gewichteten Kanten umwandeln. Ich habe die Networkx-Dokumentation durchgesehen und kann keine eingebaute Funktion finden, um dies zu erreichen. Ich habe mich nur gefragt, ob jemand eine integrierte Funktion in NetworkX kannte, die dieses Ziel erreichen könnte. Ich habe die Funktionen to_directed(), to_undirected() betrachtet, aber sie dienen nicht meinem Ziel.Networkx: Konvertieren von Multigraph in einfache Grafik mit gewichteten Kanten
Antwort
Hier ist ein Weg, um einen gewichteten Graphen aus einem gewichteten Multigraphen zu erzeugen, indem die Gewichte Summieren:
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})]
Dies ist eine großartige Lösung, fast genau das, was ich gesucht habe, außer dass mein MultiGraph kein Attribut "Gewicht" an den Kanten hat. Ich habe ein kleines Update für Ihren Code vorgeschlagen, sodass das Gewicht auf 1.0 gesetzt wird, wenn es kein solches Attribut gibt. –
Sie können die Bibliothek verwenden. Python-Erweiterungsmodul von hier herunterladen:
Eine sehr einfache Art, es zu tun, ist einfach Ihre Multigraph als Eingabe an Graph
übergeben.
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)
Dies wird einen ungerichteten Graphen Ihrer Multigraphen, wo mehrere Kanten verschmolzen werden in einzelne Kanten erstellen. Wenn Sie jedoch unterschiedliche Attribute für die Kanten haben, die zusammengeführt werden, weiß ich nicht, ob es eine Möglichkeit gibt zu bestimmen, welches Attribut beibehalten wird.
Es ist sehr nützlich zu wissen, dass ein MultiGraph so einfach in einen Graphen umgewandelt werden kann, aber es löst nicht die Anforderung des OP für gewichtete Kanten. – TheEspinosa
Sind die Multigraphen haben gewichtete Kanten? Und wenn ja, möchten Sie die Gewichte von parallelen Kanten in irgendeiner Weise kombinieren, um ein Diagramm zu erstellen? – Aric
Ja das ist genau die Situation. – anonuser0428