Python networkx:边缘收缩

时间:2013-03-26 15:28:15

标签: python graph nodes networkx edges

我有NetworkX图表。我想知道如何在多个节点之间进行edge contraction

例如,如果我想收缩X,Y和Z:

         _ node A _
       _/    |     \_
node X --- node Y --- node Z

会变成

           node A 
             |     
           node XYZ (or whatever X/Y/Z)

图表创建不是问题。有用。我想通过合并具有相同“含义”的节点来减少图形:我称之为“end lvl”的节点(节点名称长度等于7)并且它们链接在一起。

我在NetworkX中找到了缩放功能,所以我尝试使用它:

# edge contraction for same nodes
# for each node, get the links to other nodes "end lvl"
# if there is such a link, it means that these node are
# the sames
#
# copy graph
I = G
for n,d in G.nodes(data=True):
    if n in I.nodes():
        if len(n) == 7:
            # list of nodes adjacent to n : filter only "end lvl" nodes
            neighbors = [ node for node in I.neighbors(n) if len(node) == 7 ]
            nodes_to_merges = neighbors.append(n)
            I = nx.condensation(I,scc=nodes_to_merges)

我转换为JSON时得到的是:

{"directed": true, "graph": [], "nodes": [{"id": 0}], "links": [], "multigraph": false}

有一个问题,你可以看到......

对函数的引用是here

2 个答案:

答案 0 :(得分:4)

怎么样:

add_node(XYZ)
add_edge(XYZ, A)
for edge incident on (X, Y, Z):
    v = nodes in edge not in (X, Y, Z, A)
    if v:
       remove_edge(edge)
       add_edge(v, XYZ)
for node in (X, Y, Z):
    remove_node(node)

答案 1 :(得分:1)

不是尝试使用nx.condensation(用于收缩强连接组件,而不是一般的节点组),而是使用这些函数:

http://networkx.readthedocs.io/en/stable/reference/classes.graph.html#adding-and-removing-nodes-and-edges

删除所有折叠节点中的所有节点并重新连接其节点。