Python networkx:边缘收缩

Posted

技术标签:

【中文标题】Python networkx:边缘收缩【英文标题】:Python networkx : edge contraction 【发布时间】:2013-03-16 11:29:25 【问题描述】:

我有一个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。

【问题讨论】:

一种解决方案是使用 dict 表示 (to_dict_of_dicts) 手动完成。 好吧,我不熟悉图表,但我应该改进我的问题,正如@zodiac 所问的那样。来了。 nodes()、neighbours() 和condensation() 函数有什么作用? nx 是什么? nx 是 python networkx :networkx.github.com。 Nodes() 返回图的节点。 Neighbors(x) 返回节点 x 的邻居节点。 G 的凝聚是每个强连接的组件或节点都收缩为单个节点的图。 你的整个图似乎与我有很强的联系,因此输出只有一个节点。不要用它来收缩任意节点 【参考方案1】:

怎么样:

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)

【讨论】:

我用 python 和 networkx 函数重写了你的伪代码。我做了我想要的。谢谢。 请注意,以上将擦除边缘和节点的任何属性信息。【参考方案2】:

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

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

删除除一个折叠节点之外的所有节点并重新连接它们的节点。

【讨论】:

网络不存在

以上是关于Python networkx:边缘收缩的主要内容,如果未能解决你的问题,请参考以下文章

加权边缘如何影响networkx中的PageRank?

添加边缘权重以在 networkx 中绘制输出

使用 python 和 networkx 进行大图可视化

如何更改节点大小和边缘权重 NetworkX?

在 NetworkX 中创建大图时出现内存错误

在networkx中标记边缘