NetworkX:有效地诱导给定顶点的集团

Posted

技术标签:

【中文标题】NetworkX:有效地诱导给定顶点的集团【英文标题】:NetworkX: efficiently inducing clique given vertices 【发布时间】:2018-01-16 04:49:48 【问题描述】:

说,我有一个顶点列表[1, 2, 3, 4, 5],它们形成了一个集团,有没有一种快速的方法可以在 networkx 图中诱导它们之间的边?我能想到的直截了当的方法是:

from itertools import combinations

def induceClique(nxGraph, vertexList):
    for i,j in combinations(vertexList, 2):
        nxGraph.add_edge(i, j)
    return nxGraph

该函数没问题,您必须添加所有可能的边对以确保存在所需的团,但是从 Python 操作时,处理长顶点列表时会变慢。也许作为 networkx 包的一部分,有一个内置函数可以更有效地执行此操作,也许是用 C 编写的?

【问题讨论】:

(一般评论)请记住,networkx 完全是关于可读性/易用性,纯 python 的性质可能会导致一些非最佳性能。对于非常低级的库,如果此操作对您非常重要,您可能希望直接访问这些图的低级数据结构以实现最大性能。 (这是我过去在数学优化和约束矩阵等其他用例中所经历的;更具体地说:将 numpy/scipy.sparse 与 python 的 itertools 相结合:或多或少:摆脱纯 python 循环)。跨度> 你的意思是稀疏行格式图在 Python 中效率更高? FWIW:networkx包完全是用Python写的,所以一般如果你自己的方法写的好,和networkx版本差别不大(虽然我强烈推荐使用networkx版本的时候它的存在是为了可用性和更好地相信它是正确的)。 igraph 有更多用 C 编写的背景。 我对内部结构了解不多(并且有不止一个图形表示)。但是,是的。如果它基于 scipy.sparse (==c++; 它不是) 你会想要利用这个事实(如果性能很关键)。作为上述替代方案的补充:还有graph-tool(功能较少,但更注重性能)。 【参考方案1】:

生成所有边,然后一次性实例化它们:

nxGraph.add_edges_from(combinations(vertexList, 2))

【讨论】:

有什么理由比上面的for循环快吗? 因为它只调用一次函数而不是 20 次调用并且不使用 Python 循环。 @neo4k 您似乎对此感兴趣,也许您应该为您的数据做一些基准测试。在查看答案之前,您不必投票/接受答案。 (虽然我认为他的推理可能是答案的一部分) 令人惊讶的是,差异是微不足道的:我的方法只比你的方法快 3%(在 1000 个元素的集团中)。 现在我会接受这个答案,除非出现更快的问题。不过这很优雅,我喜欢它。 :)

以上是关于NetworkX:有效地诱导给定顶点的集团的主要内容,如果未能解决你的问题,请参考以下文章

Python 学习 第十六篇:networkx

在 NetworkX 中检查子图是不是为集团的最快方法

networkx 算法中是不是有一个函数可以返回我指定的某些节点周围的集团/集群/组件?

Python数模笔记-NetworkX条件最短路径

Python数模笔记-NetworkX条件最短路径

NetworkX 递归子节点