簡體   English   中英

在igraph [python]中將兩個有向邊折疊成一個

[英]Collapsing two directed edges into one in igraph [python]

我有一個有向圖,其中在許多情況下,在兩個節點之間存在邊緣雙向,具有不同的權重。 例如,a - > b的權重為3,而b - > a的權重為1.我想將這些組合成一個只存在聚合權重的圖形,即這個例子會產生一個圖形,其中一個 - >重量2。

我見過g.simplify(),但是如何讓它結合相反的邊?

假設在相同的兩個頂點之間可以有相同方向的多個邊,並且如果是這樣,你想要加權,你可以從

g.simplify(combine_edges='sum')

然后對於每對頂點ab ,最多一個邊從ab

要將這些相對邊組合成一個邊,可以使用實例方法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)

但這會給你一個無向圖,並且邊緣的權重是從ab ,還是從ba ,是不可能分辨出來的。

相反,如果你想有向圖,你如何選擇是否使邊緣體重2到B或從BA與體重-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.

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