关于python:合并(加入)networkx图 您所在的位置:网站首页 多图合并成一个图 关于python:合并(加入)networkx图

关于python:合并(加入)networkx图

2024-07-18 00:45| 来源: 网络整理| 查看: 265

假设我有两个networkx图,G和H:

1234567891011G=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图的最佳方法是什么?

我想保留节点名称(注意公共节点2到7)。 当我使用nx.disjoint_union(G,H)时,这没有发生:

12345678>>> 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节点标签已更改(不是我想要的)。 我想在具有相同编号的节点处加入图。

注意。 这不是NetworkX中"合并两个加权图"的重复。

相关讨论 如果两者都存在边缘,您想怎么办? 它应该成为双重优势吗? 还是只有一条边缘? @Joel hmm Im对这两种情况都感兴趣。 可以说是单边的。 您编写的代码可以很好地处理单边情况。 您只需执行U=nx.MultiGraph() 并简化了您的示例:for x,y in zip(fromnodes,tonodes): G.add_edge(x,y)可以写为G.add_edges_from(zip(fromnodes,tonodes))

您要查找的函数是compose,该函数将生成一个图形,其中包含两个图形中的所有边缘和所有节点。 如果两个图都具有相同名称的节点,则单个副本将最终出现在新图中。 如果两者都存在相同的边,则类似。 这是一个示例,其中包括edge / node属性:

123456789101112131415161718192021222324252627282930import 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, {})])

这些保留属性,但是显然如果存在冲突,则不可能。 H的属性优先。

还有其他选择可做对称差,交点,...

如果有多个图形要连接在一起,则可以使用compose_all,它只是在compose周围包裹了一个for循环。

相关讨论 当我们用nx.draw_networkx(G) nx.draw_networkx(H) nx.draw_networkx(F) plt.show()绘制所有图时,如何强制所有图共享具有相同标签的节点的相同位置? 我的意思是,所有3个图的节点1的坐标都应该相同。 @Sigur绘图命令采用(可选)输入pos,如nx.draw_networkx(G, pos=pos)。 pos是一个字典,其键是节点,其值是其(x,y)坐标。 您可以自己定义它,也可以通过某些layout命令定义它。 例如pos = nx.spring_layout(F)。 我想先使用布局以获得良好的显示效果,然后在添加新边并在其他窗口中再次绘图时使用相同的坐标。 Id或多或少喜欢生成一系列数字以显示图形的时间线。

做到了。

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

或者,保留edge属性:

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

并且,还保留节点属性:

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

相关讨论 在NetworkX 2.2中,必须在添加G.edges()之前将其转换为列表。 特别是在需要MultiGraph的情况下。 在具有类似G: Node1 [label="L1x"], Node2 [label="L2x"]; H: Node1 [label="L1y"], Node2 [label="L2x"]的图的情况下,该如何处理?其中节点1表示要成为连接图中的不同节点,而节点2是常见的。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有