2013-03-23 2 views
10

Ho un oggetto multigraph e vorrei convertirlo in un oggetto grafico semplice con bordi ponderati. Ho esaminato la documentazione di networkx e non riesco a trovare una funzione integrata per raggiungere questo obiettivo. Mi stavo chiedendo se qualcuno fosse a conoscenza di una funzione integrata in networkx che potesse raggiungere questo obiettivo. Ho guardato le funzioni to_directed(), to_undirected() ma non servono il mio obiettivo.Networkx: Converti multigraph in semplice grafico con bordi ponderati

+0

Può la multigrafo sono ponderati? E se è così, vuoi combinare i pesi dai bordi paralleli in qualche modo per costruire un grafico? – Aric

+0

Sì, questa è esattamente la situazione. – anonuser0428

risposta

14

Ecco un modo per creare un grafo pesato da un multigrafo ponderata sommando i pesi:

bordi
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

Questa è un'ottima soluzione, quasi esattamente ciò che stavo cercando, ad eccezione del fatto che il mio MultiGraph non ha un attributo 'peso' sui bordi. Ho suggerito un piccolo aggiornamento del codice, quindi imposta il peso su 1.0 se non esiste un attributo di questo tipo. –

10

Un modo molto semplice di farlo è solo per passare il vostro multigrafo come input per 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) 

Questo creerà un grafo non orientato della tua multi-pagina in cui i bordi multipli vengono uniti in bordi singoli. Tuttavia, se si hanno attributi diversi per i bordi che vengono uniti, non so se c'è un modo per determinare quale attributo è mantenuto.

+0

È molto utile sapere che un MultiGraph può essere facilmente convertito in un grafico, ma non risolve il requirenment dell'OP per i bordi ponderati. – TheEspinosa