Mam obiekt multigraph i chciałbym go przekonwertować na prosty obiekt graficzny z ważonymi krawędziami. Przejrzałem dokumentację networkx i nie mogę znaleźć wbudowanej funkcji, aby to osiągnąć. Właśnie zastanawiałem się, czy ktoś wiedział o wbudowanej funkcji w networkx, która mogłaby osiągnąć ten cel. Spojrzałem na funkcje to_directed(), to_undirected(), ale nie służą one mojemu celowi.Networkx: Konwertuj multigraph do prostego wykresu z ważonymi krawędziami
Odpowiedz
Oto jeden sposób, aby stworzyć wykres ważoną z ważoną multigraf poprzez zsumowanie wagi:
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})]
To świetne rozwiązanie, prawie dokładnie to, czego szukałem, z tym że mój MultiGraph nie ma atrybutu "waga" na krawędziach. Zasugerowałem małą aktualizację twojego kodu, więc domyślnie ma wagę do 1,0, jeśli nie ma takiego atrybutu. –
Możesz użyć biblioteki igraph. Pobierz moduł rozszerzający python stąd: http://igraph.sourceforge.net/download.html
Jednym z bardzo prostych sposobów na przekazanie swojego multigrafu jako wejścia do 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)
Spowoduje to utworzenie niekierowanego wykresu twojego multigrafu, w którym wiele krawędzi zostanie scalonych w pojedyncze krawędzie. Jeśli jednak masz różne atrybuty krawędzi, które się łączą, nie wiem, czy istnieje sposób na określenie, który atrybut jest zachowany.
Bardzo dobrze jest wiedzieć, że MultiGraph można tak łatwo przekonwertować na wykres, ale nie rozwiązuje on wymagań PO dla ważonych krawędzi. – TheEspinosa
Czy multigraf nie ważone krawędzie? A jeśli tak, czy chcesz połączyć ciężary z równoległych krawędzi w jakiś sposób, aby zbudować wykres? – Aric
Tak, to jest dokładnie ta sytuacja. – anonuser0428