Saltar al contenido

Combinar (unir) gráficos networkx

Si hallas algún problema con tu código o trabajo, recuerda probar siempre en un entorno de testing antes aplicar el código al trabajo final.

Solución:

La función que está buscando es componer, que produce un gráfico con todos los bordes y todos los nodos que están en ambos gráficos. Si ambos gráficos tienen un nodo con el mismo nombre, una sola copia termina en el nuevo gráfico. Del mismo modo si existe la misma arista en ambos. Aquí hay un ejemplo, que incluye borde/nodo attributes:

import networkx as nx

G=nx.Graph()
G.add_node(1, weight = 2)
G.add_node(2, weight = 3)
G.add_edge(1,2, flux = 5)
G.add_edge(2,4)

H=nx.Graph()
H.add_node(1, weight = 4)
H.add_edge(1,2, flux = 10)
H.add_edge(1,3) 

F = nx.compose(G,H)
#F has all nodes & edges of both graphs, including attributes
#Where the attributes conflict, it uses the attributes of H.

G.nodes(data=True)
> NodeDataView(1: 'weight': 2, 2: 'weight': 3, 4: )
H.nodes(data=True)
> NodeDataView(1: 'weight': 4, 2: , 3: )
F.nodes(data=True)
> NodeDataView(1: 'weight': 4, 2: 'weight': 3, 4: , 3: )

G.edges(data=True)
> EdgeDataView([(1, 2, 'flux': 5), (2, 4, )])
H.edges(data=True)
> EdgeDataView([(1, 2, 'flux': 10), (1, 3, )])
F.edges(data=True)
EdgeDataView([(1, 2, 'flux': 10), (1, 3, ), (2, 4, )])

Estos conservan attributes, pero obviamente si hay un conflicto esto no es posible. los attributes de H prevalecerán.

También hay otras opciones para hacer la diferencia simétrica, intersección,…

Si tiene varios gráficos para unir, puede usar compose_allque simplemente envuelve un bucle for alrededor compose.

Esto lo hizo.

   U=nx.Graph()
   U.add_edges_from(G.edges()+H.edges())
   U.add_nodes_from(G.nodes()+H.nodes()) #deals with isolated nodes

o, conservando el borde attributes:

   U.add_edges_from(G.edges(data=True)+H.edges(data=True))

y, para preservar también el nodo attributes:

   U.add_nodes_from(G.nodes(data=True)+H.nodes(data=True))

No se te olvide dar recomendación a este post si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *