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
risposta
Ecco un modo per creare un grafo pesato da un multigrafo ponderata sommando i pesi:
bordiimport 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})]
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. –
È possibile utilizzare la libreria igraph. Scarica modulo di estensione python da qui: http://igraph.sourceforge.net/download.html
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.
È 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
Può la multigrafo sono ponderati? E se è così, vuoi combinare i pesi dai bordi paralleli in qualche modo per costruire un grafico? – Aric
Sì, questa è esattamente la situazione. – anonuser0428