【问题标题】:tagging connected components using networkx使用 networkx 标记连接的组件
【发布时间】:2020-02-02 17:43:08
【问题描述】:

使用igraph 我可以为每个节点分配连接组件的唯一ID:

import igraph 
def tag_components(vertices, edges):
    graph = igraph.Graph()
    graph.add_vertices(vertices)
    graph.add_edges(edges)
    graph_tags = graph.clusters().membership
    return graph_tags
print(tag_components([0,1,2,3,4,5], [[1,2],[2,4],[3,5]]))

它输出[0, 1, 1, 2, 1, 2],这意味着3个连接的组件索引为012,与节点组[0][1, 2, 4][3, 5]一致。如何使用networkx? 实现相同的输出

我希望是这样的:

def tag_components_nx(vertices, edges):
    G = nx.Graph()
    G.add_nodes_from(vertices)
    G.add_edges_from(edges)
    ...
    return graph_tags

更新

我已经有了一个满意的答案,我想知道networkx 是否有比connected_components 更复杂的方法适合我的问题

【问题讨论】:

    标签: python networkx igraph


    【解决方案1】:

    nx.connected_components的输出开始,您可以构建所需的输出格式。

    示例。

    >>> g.nodes()
    NodeView((0, 1, 2, 3, 4, 5))
    >>> g.edges()
    EdgeView([(1, 2), (2, 4), (3, 5)])
    >>> idx_components = {u:i for i,node_set in enumerate(nx.connected_components(g)) for u in node_set}
    >>> res = [idx_components[u] for u in vertices]
    >>> res
    [0, 1, 1, 2, 1, 2]
    

    【讨论】:

    • 毫无疑问,connected_components 是我最常用的networkx 方法。感谢您的示例,如果可能,我将对其进行测试并尝试使其与 numpy 操作一致。
    • 如果有人提供比connected_components 更复杂的方法,那将是一个巨大的奖励。
    • networkx 使用的算法是一个bfs 对每个尚未访问的节点执行,它在节点和边的数量上是线性的。为什么需要更复杂的方法?
    • 想出像你这样的解决方案需要一点时间,而且我不是networkx 的专家,所以我想知道他们是否有替代方案。
    • 顺便说一句,我使用networkx 仅用于演示目的,这就是为什么我正在寻找类似common ways 的东西来解决它。
    猜你喜欢
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多