python,igraph应对顶点重新编号

时间:2012-08-24 11:24:10

标签: python igraph

我正在使用python + igraph实现一种在有向图中查找密集子图的算法。主循环保持两个子图S和T,这两个子图最初是相同的,并且去除与这些节点相对于另一个图的不等(或超出度)的计数的节点(和入射边)。我遇到的问题是igraph重新编号顶点所以当我从T中删除一些时,剩下的节点不再对应于S中的相同节点。

以下是循环的主要部分。

def directed(S):
    T = S.copy()
    c = 2
    while(S.vcount() > 0 and T.vcount() > 0):
        if (S.vcount()/T.vcount() > c):
            AS = S.vs.select(lambda vertex: T.outdegree(vertex) < 1.01*E(S,T)/S.vcount())
            S.delete_vertices(AS)
        else:
            BT = T.vs.select(lambda vertex: S.indegree(vertex) < 1.01*E(S,T)/T.vcount())
            T.delete_vertices(BT)

由于在顶点id上删除顶点的效果,这不起作用。这个问题有标准的解决方法吗?

1 个答案:

答案 0 :(得分:3)

一种可能性是为name顶点属性中的顶点指定唯一名称。删除顶点时这些顶点保持不变(与顶点ID不同),您可以使用它们来引用indegreeoutdegree等函数中的顶点。 E.g:

>>> g = Graph.Ring(4)
>>> g.vs["name"] = ["A", "B", "C", "D"]
>>> g.degree("C")
2
>>> g.delete_vertices(["B"])
>>> g.degree("C")
1

请注意,我删除了顶点B,因此顶点C也获得了一个新ID,但名称仍然相同。

在您的情况下,具有select条件的行可能会重写为:

AS = S.vs.select(lambda vertex: T.outdegree(vertex["name"]) < 1.01 * E(S,T)/S.vcount())

当然,这假设最初的ST中的顶点名称相同。