<p>我有一个<a href="http://networkx.github.com" rel="nofollow">NetworkX</a>图。我想知道如何在多个节点之间做<a href="http://en.wikipedia.org/wiki/Edge_contraction" rel="nofollow">edge contraction</a>。在</p>
<p>例如,如果我想承包X、Y和Z:</p>
<pre><code> _ node A _
_/ | \_
node X --- node Y --- node Z
</code></pre>
<p>会变成</p>
^{pr2}$
<p>图形创建不是问题。它起作用了。我想通过合并具有相同“含义”的节点来减少图:我称之为“endlvl”(节点名长度等于7)并且链接在一起的节点。在</p>
<p>我在NetworkX中找到了condensation函数,因此我尝试使用它:</p>
<pre><code># 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.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>(n)
I = nx.condensation(I,scc=nodes_to_merges)
</code></pre>
<p>当我转换成JSON时,我得到的是:</p>
<pre><code>{"directed": true, "graph": [], "nodes": [{"id": 0}], "links": [], "multigraph": false}
</code></pre>
<p>正如你所看到的,有一个问题。。。在</p>
<p>对函数的引用是<a href="http://networkx.github.com/documentation/" rel="nofollow">here</a>。在</p>
<p>怎么样:</p>
<pre><code>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)
</code></pre>