2013-07-01 123 views
2

我想找到通過使用Igraph共享相同的邊緣屬性(因此可以有大量的頂點這樣)的所有頂點(頂點ID's)。當我想在「道路」上找到所有「村莊」(我的圖的頂點)時,這會非常方便,我們假設「路線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和文檔中錯過了一個方法。它聞起來像有一個非常簡單的方法。 非常感謝您的任何建議!

回答

3

首先,選擇所有的邊緣上路線69:

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

然後通過選定的邊進行迭代,並收集頂點的端點:

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

這會給你包含了一組至少一個邊緣上出現的所有頂點的頂點ID,名稱爲Route69。如果您需要VertexSeq,您可以簡單地執行此操作:

vertices = g.vs[sorted(vertices)] 
+0

謝謝Tamás再次。這個解決方案很有效,它的實現非常簡單。 – Laci

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' 

這假定「村村通」和「Route69」存儲在名爲「名稱」的頂點和邊屬性...適當調整以匹配您的屬性。

當然 - 你能擠進這一切都成一條線,如果你想:

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

不知道這是最有效的方式(雖然我沒有看到在文檔中的任何快捷方式),但它應該讓你知道你在做什麼。

+0

感謝您的貢獻。可能不是最有效的,但也適用。 – Laci

相關問題