3

我想通过使用 Igraph 找到共享相同边缘属性的所有顶点(顶点 ID)(因此可能有大量这样的顶点)。当我想在“道路”上找到所有“村庄”(我的图形的顶点)时,这将非常方便,比如“Route 69”(边缘属性)。

Igraph 中是否有一种简单的方法可以做到这一点?也许我把它复杂化了。

实际上我需要的是相反的:g.es.select(_within=g.vs[2:5])

>>> men = g.vs.select(gender="m")
>>> women = g.vs.select(gender="f")
>>> g.es.select(_between=(men, women))

因为我知道边缘属性但我不知道顶点。

我将选择边并希望它会返回所有相关的顶点。

也许我现在只是累了,但我没有找到解决这个问题的方法。如果有人以正确的方式帮助我,我将不胜感激。或者也许我在教程和文档中错过了一种方法。闻起来有一个非常简单的方法。提前感谢您的任何建议!

4

2 回答 2

4

您应该能够执行以下操作:

r69edges = g.es.select(name_eq='Route69')  #Select all edges where name=='Route69'
sg = r69edges.subgraph()  #Create a subgraph containing only the selected edges (and attached vertices)
village_verts = sg.vs.select(name_eq='villages')  #Select the vertices where name=='villages'

这假设“村庄”和“Route69”存储在顶点和边上名为“名称”的属性中......适当调整以匹配您的属性。

当然 - 如果你愿意,你可以把这一切压缩成一行:

village_verts = g.es.select(name_eq='Route69').subgraph().vs.select(name_eq='villages')

不确定这是否是最有效的方法(尽管我在文档中没有看到任何快捷方式),但它应该能让你得到你想要的。

于 2013-07-01T14:17:21.600 回答
4

首先,选择 Route 69 上的所有边:

edges = g.es.select(name="Route69")

然后遍历选定的边并收集顶点的端点:

vertices = set()
for edge in edges:
    vertices.update(edge.tuple)

这将为您提供一组包含所有顶点的顶点 ID,这些顶点至少与 name 的一条边发生事件Route69。如果你需要一个 VertexSeq,你可以简单地这样做:

vertices = g.vs[sorted(vertices)]
于 2013-07-01T15:52:18.783 回答