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:边缘收缩的主要内容,如果未能解决你的问题,请参考以下文章