Подтвердить что ты не робот

Объединить (join) networkx Графики

Скажем, у меня есть два сетевых графика, G и 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)

Каков наилучший способ присоединиться к двум диаграммам networkx?

Я хотел бы сохранить имена node (обратите внимание на общие узлы, от 2 до 7). Когда я использовал nx.disjoint_union(G,H), этого не произошло:

>>> 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]
# 

Ярлыки H node были изменены (не то, что я хочу). Я хочу присоединиться к графикам в узлах с таким же числом.

Примечание. Это не дубликат Объедините два взвешенных графика в NetworkX.

4b9b3361

Ответ 1

Функция, которую вы ищете, compose.

import networkx as nx
G=nx.Graph()
G.add_edge(1,2)
H=nx.Graph()
H.add_edge(1,3)
F = nx.compose(G,H)
F.edges()
> [(1, 2), (1, 3)]

Существуют также другие варианты симметричная разница, пересечение,...

Если у вас есть несколько графиков для объединения, вы можете использовать compose_all, который просто обертывает цикл for вокруг compose.

Ответ 2

Сделал это.

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

или, сохраняя атрибуты края:

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

а также сохранить атрибуты node:

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