簡體   English   中英

對networkx中的節點進行分組

[英]grouping nodes in networkx

我不知道合適的術語,但是我在networkx中有一個圖,我想使用映射功能合並相關節點,並維護到原始節點的鏈接

例如,如果我有此圖:

a1 -> b1
a2 -> b2
a1 -> c1
a2 -> d2
b1 -> d2
c1 -> f1
c2 -> f2
b1 -> c2

和這個功能

def mymap(node):
    return node[0]

那么我想得到這個圖作為結果:

a -> b
a -> c
a -> d
b -> d
c -> f
b -> c

帶有節點數據

a: original_nodes = [a1, a2]
b: original_nodes = [b1, b2]
c: original_nodes = [c1, c2]
d: original_nodes = [d2]
f: original_nodes = [f1, f2]

有沒有辦法做到這一點? (無需手動遍歷節點和邊緣;我可以做到這一點,但我認為這將是一項常見的任務)

嗯,我以為我以前記得做過這件事,只是在我的一個Python腳本中發現了這一點:

def supergraph(g1, keyfunc, allow_selfloops=True):
    g2 = nx.DiGraph()
    for (a,b,d) in g1.edges_iter(data=True):
        result = keyfunc(g1,a,b,d)
        if result is not None:
            a2,b2,w = result
            if a2 != b2 or allow_selfloops:
                g2.add_edge(a2,b2)
                try:
                    g2[a2][b2]['weight'] += w
                except:
                    g2[a2][b2]['weight'] = w

            for u2,u in [(a2,a),(b2,b)]:
                if not u2 in g2:
                    g2.add_node(u2, original_nodes=set([u]))
                else:
                    try:
                        g2.node[u2]['original_nodes'].add(u)
                    except:
                        g2.node[u2]['original_nodes'] = set([u])
    return g2

其中具有圖g,節點a和b以及邊緣數據d的keyfunc(g,a,b,d)是一個映射函數,應該返回None (忽略該邊緣)或元組(a2, b2, w)具有新的節點a2和b2,權重w。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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