根据顶点名称,在Python igraph中执行图的并集操作

3
这个问题在大约6个月前已经在github上被提出,但由于仍未得到解决,我想知道是否有我没有发现的快速修复方法。
我想要根据它们的名称合并两个图。
g1 = igraph.Graph()
g2 = igraph.Graph()

# add vertices
g1.add_vertices(["A","B"])
g2.add_vertices(["B","C","D"])

for vertex in g1.vs:
    print vertex.index
0
1

for vertex in g2.vs:
    print vertex.index
0
1
2

然而,当我执行union操作时,igraph使用顶点ID而不是名称,所以最终只有三个顶点而不是四个(如果基于名称的话)。我猜想这是因为g2中的B在索引0中,所以它与g1中的A合并。同样地,g2中的Cg1中的B合并。
g_union = igraph.Graph.union(g1,g2)

g_union.vs['name'] # of course
KeyError: 'Attribute does not exist'

for vertex in g_union.vs:
    print vertex.index
0
1
2

有什么办法可以绕过这个问题吗?在igraph的R实现中已经做到了,因此这是可能的。

目前igraph还不支持按名称合并(union by name)(除非你自己编写代码)。C核心本身不支持基于顶点属性的联合。R版本支持它,因为有人在纯R中编写了一个函数。不幸的是,我最近没有太多时间投入到igraph中,所以恐怕你必须自己用Python想出类似的函数。 - Tamás
@Tamás,感谢你坦率的回答。我会尝试在Python中复现R函数,并在有进展时及时向您报告。 - Antoine
@Tamás,我在Github上找不到你提到的那个R函数。你能指点一下吗?感谢你的时间。 - Antoine
R-igraph中的所有图形运算符(并集、交集等)都在此处:https://github.com/igraph/rigraph/blob/dev/R/operators.R。如果@byname=TRUE@,它们将使用顶点名称(而不是ID)执行操作。 - Tamás
@Tamás 谢谢,我知道这一点,问题是我无法获取 R 源代码。当我输入 getAnywhere(union.igraph) 时,我只得到以下信息:`找到一个与 'union.igraph' 匹配的单个对象 它在以下位置被找到: 来自 igraph 命名空间的 'union' 的已注册的 S3 方法 命名空间:igraph 具有以下值:function (..., byname = "auto") { .igraph.graph.union.or.intersection("R_igraph_union", ..., byname = byname, keep.all.vertices = TRUE) } <environment: namespace:igraph>` - Antoine
1个回答

0

只需创建一个新图形,并按名称添加顶点。当然,这将消除其他节点属性,您还需要手动添加。

g1 = igraph.Graph()
g2 = igraph.Graph()

# add vertices
g1.add_vertices(["A","B"])
g2.add_vertices(["B","C","D"])

g3 = igraph.Graph()
verts_to_add = []
for v in g1.vs:
    if v['name'] not in verts_to_add:
        verts_to_add.append(v['name'])
for v in g2.vs:
    if v['name'] not in verts_to_add:
        verts_to_add.append(v['name'])

g3.add_vertices(verts_to_add)

for v in g3.vs:
    print(v['name'])

#A
#B
#C
#D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接