从有向图中制作只有相互边的子图的最佳方法

时间:2021-01-18 11:43:42

标签: igraph python-igraph

我正在使用 igraph python 库中的有向图。 我试图得到一个只包含相互边的子图。

我目前的实现是:

i = 0
edgeList = list()
for e in completeGraph.es:
    i = i+1
    if not e.is_mutual():
        edgeList.append(e)
        if i % 1000 == 0:
            print(i)
completeGraph.delete_edges(edgeList)
completeGraph.vs.select(_degree=0).delete()

这似乎有效,但感觉是一种非常迂回的方式,而且在一个非常大的图上(就像我正在使用 ~20 Mio. Edges 处理的类型)它相当慢。

有没有更好或更有效的方法来完成同样的事情?

1 个答案:

答案 0 :(得分:0)

我有一个可能的解决方案。我用 Python 3.8.5 和 igraph 0.9.1 做到了。我创建了一个简单的例子,一个有 10 个顶点和 7 个边(4 个相互关系)的有向图。也许它可以帮助你。

from igraph import *

g = Graph(directed=True)
g.add_vertices(10)
g.add_edges([(0, 1), (1, 0), (5, 3), (7, 8), (9, 1), (7, 2), (2, 7)])

g.es.select(_is_mutual=False).delete()
g.vs.select(_degree=0).delete()

结果是图 g 只有相互的边(以及这些边中涉及的顶点)。

祝你好运!

相关问题