tutorial girona español curso python graph-theory networkx

python - girona - Combinar(unir) redx Gráficos



qgis manual (2)

Digamos que tengo dos gráficas networkx, G y H :

G=nx.Graph() fromnodes=[0,1,1,1,1,1,2] tonodes=[1,2,3,4,5,6,7] for x,y in zip(fromnodes,tonodes): G.add_edge(x,y) H=nx.Graph() fromnodes=range(2,8) tonodes=range(8,14) for x,y in zip(fromnodes,tonodes): H.add_edge(x,y)

¿Cuál es la mejor manera de unir los dos gráficos networkx?

Me gustaría conservar los nombres de los nodos (tenga en cuenta los nodos comunes, de 2 a 7). Cuando usé nx.disjoint_union(G,H) , esto no sucedió:

>>> G.nodes() [0, 1, 2, 3, 4, 5, 6, 7] >>> H.nodes() [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] >>> Un= nx.disjoint_union(G,H) >>> Un.nodes() [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] #

Se cambiaron las etiquetas del nodo H (no lo que quiero). Quiero unir los gráficos en los nodos con el mismo número.

Nota. Esto no es un duplicado de Combine dos gráficos ponderados en NetworkX .


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 los atributos de borde:

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

y, para preservar también los atributos del nodo:

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


La función que está buscando es compose , 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, entonces una sola copia termina en el nuevo gráfico. Del mismo modo si existe el mismo borde en ambos. Aquí hay un ejemplo, que incluye atributos de borde / nodo:

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 los atributos, pero obviamente si hay un conflicto esto no es posible. Los atributos de H tienen prioridad.

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

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