[英]Collapsing two directed edges into one in igraph [python]
我有一個有向圖,其中在許多情況下,在兩個節點之間存在邊緣雙向,具有不同的權重。 例如,a - > b的權重為3,而b - > a的權重為1.我想將這些組合成一個只存在聚合權重的圖形,即這個例子會產生一個圖形,其中一個 - >重量2。
我見過g.simplify(),但是如何讓它結合相反的邊?
假設在相同的兩個頂點之間可以有相同方向的多個邊,並且如果是這樣,你想要加權,你可以從
g.simplify(combine_edges='sum')
然后對於每對頂點a和b ,最多一個邊從a到b 。
要將這些相對邊組合成一個邊,可以使用實例方法to_undirected
,它將g
轉換為無向圖。 在第一步之后,每對頂點之間應該至多有兩條邊,總是相對的。 因此,如果你想從另一個方向減去一個方向的重量,你可以這樣做:
def subwt(attrs):
if len(attrs) == 1:
return attrs[0]
assert len(attrs) == 2
return attrs[0] - attrs[1]
g.to_undirected(combine_edges=subwt)
但這會給你一個無向圖,並且邊緣的權重是從a到b ,還是從b到a ,是不可能分辨出來的。
相反,如果你想有向圖,你如何選擇是否使邊緣從體重2到B或從B到A與體重-2?
這是一個能產生這種有向圖的函數; 輸出圖中每條邊的方向由輸入圖中頂點之間遇到的第一條邊確定。 此外,除了“權重”之外的任何邊緣屬性都是從第一個邊緣復制的,忽略任何其他邊緣。
def combine_edges(graph):
combe = graph.copy() # copies graph attributes, vertex attributes
combe.delete_edges(None) # removes all edges
for e in graph.es:
src, targ = e.tuple
if combe.are_connected(src, targ):
ced = combe.es(_source=src, _target=targ)[0]
ced['weight'] += e['weight']
elif combe.are_connected(targ, src):
ced = combe.es(_source=targ, _target=src)[0]
ced['weight'] -= e['weight']
else:
combe.add_edge(src, targ, **e.attributes())
return combe
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.