我想通过使用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))
因为我知道边缘属性,但我不知道顶点。
我将选择边缘并希望它将返回所有相关的顶点。
也许我现在只是累了,但我找不到解决这个问题的方法。如果有人以正确的方式帮助我,我感激不尽。或者也许我在tutorial和文档中遗漏了一种方法。它闻起来有一种非常简单的方法。 提前感谢您的任何建议!
答案 0 :(得分:3)
您应该能够执行以下操作:
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'
这假设'villages'和'Route69'存储在顶点和边上名为'name'的属性中......适当调整以匹配您的属性。
当然 - 如果你愿意,你可以把这一切都压成一行:
village_verts = g.es.select(name_eq='Route69').subgraph().vs.select(name_eq='villages')
不确定这是否是最有效的方法(虽然我在文档中没有看到任何快捷方式),但它应该能让你得到你想要的东西。
答案 1 :(得分:3)
首先,选择Route 69上的所有边缘:
edges = g.es.select(name="Route69")
然后迭代选定的边并收集顶点的端点:
vertices = set()
for edge in edges:
vertices.update(edge.tuple)
这将为您提供一个集合,其中包含至少一个名为Route69
的边缘上的所有顶点的顶点ID。如果您需要VertexSeq,只需执行以下操作:
vertices = g.vs[sorted(vertices)]