2013-03-23 20 views
10

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

+0

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

+0

Tak, to jest dokładnie ta sytuacja. – anonuser0428

Odpowiedz

14

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

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. –

10

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.

+0

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