【问题标题】:Find IDs of all edges between vertexes with igraph Python使用 igraph Python 查找顶点之间所有边的 ID
【发布时间】:2018-10-08 17:08:28
【问题描述】:

使用 Python igraph 库,我有一个表示道路网络的有向图,每个顶点之间的距离(坐标)作为权重。一个顶点对之间很可能有两条或多条边,具有不同的权重。我需要通过查询顶点 ID 从图中检索这些权重,例如示例图:

import igraph as ig

g = ig.Graph(directed=True)

g.add_vertices(4)

edges = [(0, 1), (1, 2), (1, 2), (2, 3)]
g.add_edges(edges)

g.es[:]["dist"] = [1, 2, 3, 4]

我知道我可以得到一个边的id,然后属性如下,但这似乎只能找到最后添加的例如:

g.get_eid((0, 1)) # returns 0
g.get_eid((1, 2)) # returns 2

因此,在 1 和 2 之间有两条边,但 get_eid 只返回一条边——我需要知道这两条边,然后查询边属性并返回权重,以便从图中选择正确的最小距离,就像以前一样由距离加权最短路径查询使用。有没有办法用 igraph 做到这一点?

【问题讨论】:

    标签: python igraph


    【解决方案1】:

    我认为你对 python 不走运。 get_eid 的文档说

    返回顶点 v1 和 v2 之间任意边的边 ID

    get_eids 的文档明确指出:

    该方法不考虑多重边;如果有多个边 在一对顶点之间,只返回其中一条边的 ID。

    奇怪的是,igraph 的 R 版本确实支持你想要的功能。 函数get.edge.ids 有一个参数multi,它允许您像这样获得多个边。

    无奈之下,我尝试在python代码中添加multi=True,但它只是给了我:

    'multi' 是此函数的无效关键字参数

    【讨论】:

    • 这也是我的结论,也看到了 R 实现的不同。太糟糕了。所以,我将相关数据记录在一个字典中,谢谢。
    【解决方案2】:

    进一步@G5W 的回答,get_eid 函数似乎不是在两个节点之间给出“任意”边缘,而是在多个节点的情况下,具有最高 id 的那个。考虑:

    g = ig.Graph()
    g.add_vertices(['A', 'B', 'C'])
    g.add_edges([('A', 'B'), ('A', 'B'), ('A', 'B'), ('B', 'C'), ('B', 'C')])
    g.get_eid(0, 1) #always returns 2
    g.get_eid(1, 2) #always returns 4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-14
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多