合并(加入)networkx图

发布于 2021-01-29 15:06:57

假设我有两个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图的最佳方法是什么?

我想保留节点名称(注意公共节点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节点标签被改变(不是我想要的)。我想在具有相同编号的节点处加入图。

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

关注者
0
被浏览
121
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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

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

    还有其他选择可做对称差异,相交,…

    如果您有多个图形要连接在一起,则可以使用compose_all,只需将for循环环绕compose



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看