【问题标题】:Largest weakly connected component in networkXnetworkX 中最大的弱连接组件
【发布时间】:2014-10-07 14:43:43
【问题描述】:

我有两个问题。

  1. 在无向图中,我想找到最大的连通分量。 我阅读了networkX的API文档,找到了这个函数 nx.connected_component_subgraphs()。但是我不知道怎么用,因为它的返回值是一个生成器,我无法导出最大连通分量的子图。

  2. 同一个。但是图是有向的。我想找到有向图的最大弱连接分量。因此,我使用nx.weakly_connected_component_subgraphs(),这个函数。问题1也有同样的问题。

如何使用networkX的内置函数找到无向图中的最大连通分量和有向图中最大的弱连通分量?

我使用 NetworkX 1.9.1。

【问题讨论】:

    标签: python graph networkx centralized


    【解决方案1】:

    NetworkX 组件函数返回 Python 生成器。您可以使用 Python list 函数在生成器中创建项目列表。下面是一个例子,展示了这一点,并找到了最大的弱连接组件。

    In [1]: import networkx as nx
    
    In [2]: G = nx.DiGraph()
    
    In [3]: G.add_path([1,2,3,4])
    
    In [4]: G.add_path([10,11,12])
    

    您可以使用例如list 将生成器变成子图列表:

    In [5]: list(nx.weakly_connected_component_subgraphs(G))
    Out[5]: 
    [<networkx.classes.digraph.DiGraph at 0x278bc10>,
     <networkx.classes.digraph.DiGraph at 0x278ba90>]
    

    max 运算符接受一个关键参数,您可以将其设置为 Python 函数 len,该函数在每个子图上调用 len(g) 来计算节点数。因此,要获得节点数最多的组件,您可以编写

    In [6]: largest = max(nx.weakly_connected_component_subgraphs(G),key=len)
    
    In [7]: largest.nodes()
    Out[7]: [1, 2, 3, 4]
    
    In [8]: largest.edges()
    Out[8]: [(1, 2), (2, 3), (3, 4)]
    

    【讨论】:

    • 看起来这不起作用,可能从 networkx 2.1 开始。你只是得到一个集合而不是一个有向图,所以你不再有 .nodes() 可用:(
    【解决方案2】:

    目前,提供的解决方案不再有效,因为weakly_connected_component_subgraphs 在 networkx 上已被弃用。

    TLDR:使用subgraph(original_graph, weakly_connected_component_set)

    不使用旧版本的networkx,可以通过执行以下操作来获得最大的弱连接组件:

    #create an example graph
    import networkx as nx
    G = nx.lollipop_graph(10, 5)
    G = G.to_directed() #weakly connected component needs a directed graph.
    

    您可以收集所有弱连接子图,也可以通过执行以下操作选择最大子图:

    #list of all weakly connected subgraphs, each one is a set. 
    #If you don't list them, you'll get a generator.
    list_of_subgraphs = list(nx.weakly_connected_components(G))
    
    list_of_digraphs = []
    
    for subgraph in list_of_subgraphs:
        list_of_digraphs.append(nx.subgraph(G, subgraph)) #this is the relevant part.
    

    这些子图中的每一个现在都将是存储在list_of_digraphs 中的一个 nx 有向图。

    如果你想要最大弱连接子图,

    max_wcc = max(nx.weakly_connected_components(G), key=len)
    max_wcc = nx.subgraph(G, max_wcc)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      • 2023-03-14
      相关资源
      最近更新 更多