[英]Select individual edges by source-target-tuple in python igraph
對於給定的圖形g
我想為給定的單個邊更改一個屬性,例如'color'
,可以這樣完成
g.es[0]['color'] = some_color
但是,這需要知道邊緣的列表索引,此處為0
。 假設我只知道邊緣的源目標元組,例如(0,1)
,是否有一種簡單的方法可以使用該元組執行上述操作,還是我必須遍歷整個圖來確定邊緣索引?
使用圖形對象的get_eid
方法獲取兩個給定頂點之間的任意邊的ID; 例如:
g.es[g.get_eid(0, 1)]["color"] = "red"
您可以為所有指向索引的源目標元組建立字典,這將大大增加訪問時間。 當然,只有經常這樣做才有意義。 否則,迭代應該更快。
d = { node['source-target']: index for index, node in enumerate(g.es) }
print d[(0,1)] # will print 0
注意:我還沒有找到igraph的東西,所以我不得不猜測如何從節點中獲取源目標元組。 我的猜測是您可能需要調整的node['source-target']
。
還請注意,可能存在多個具有相同源-目標元組的節點。 在這種情況下,您只會得到其中之一。 如果您需要全部(例如作為列表),我們可以更改它。 只需更清楚地指定:)
我發現最快的方法是這樣做:
g.es.find(_between=((v_src.index,), (v_dest.index,)))
是的,這很奇怪... _between
元組中的源和目標都是元組本身(並且,如果您使用search
而不是find
,並且指定了多個起點/終點,它將返回所有合格邊的列表)。 如果您有igraph.Vertex,則可以獲得類似的索引; 如果您已經有了索引,請直接使用它們。
還有一種方法可以做到這一點:
# DON'T DO THIS!
g.es.find(_source=v_src.index, _target=v_dest.index)
但是由於某種原因,速度要慢幾個數量級!
In [23]: %timeit G.g.es.find(_between=((0,), (4,)))
10000 loops, best of 3: 128 µs per loop
In [24]: %timeit G.g.es.find(_source=0, _target=4)
100 loops, best of 3: 1.72 ms per loop
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.