簡體   English   中英

通過python igraph中的source-target-tuple選擇單個邊緣

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM