从 networkx 中的 DiGraph 中删除一个节点,同时保留 child 个节点并重新映射它们的边
Removing a node from DiGraph in networkx while preserving child nodes and remapping their edges
我想从 networkx
中的 DiGraph
中删除一个节点,以便保留所有 child 节点并重新映射它们的边缘(或删除旧边缘 + new created) 到他们 parent 节点的 parent。节点将根据节点属性(例如它属于哪个组)被删除。
例如,我希望以编程方式删除具有属性 Group B
的节点并将所有直接 child 节点重新映射到原始 parent (在多个 grand[=27 的情况下) =]s,我想映射到所有这些)。
我可以通过遍历 DiGraph
来想到一个粗略的方法,查看它的直接后继和前任,在它们之间创建关系,然后删除节点,但也许有更优雅的方法吗?
for node in DiG.nodes(data=True):
if node[1].get('node_group') == "Group B":
pre = DiG.predecessors(node[0])
suc = DiG.successors(node[0])
for p in pre:
for s in suc:
DiG.add_edge(s, p)
DiG.remove_node(node[0])
您可以做到这一点的一种方法是确定您想要 "remove" 的节点并将它们与其前任或 "parent" 节点联系起来。 edge contraction 从图中删除一条边并合并先前连接的两个节点。
所以检查你提出的小例子:
from networkx.drawing.nx_agraph import graphviz_layout
edgelist = [('Group A', 'Group B'), ('Group B', 'Group C'),
('Group B', 'Group D'), ('Group B', 'Group E')]
G = nx.from_edgelist(edgelist, create_using=nx.DiGraph)
plt.figure(figsize=(6,6))
pos=graphviz_layout(G, prog='dot')
nx.draw(G, pos=pos,
node_color='lightgreen',
node_size=1500,
with_labels=True,
arrows=True)
现在我们可以找到有问题的节点并将 link 它们的边收缩到它的前任之一 nx.contracted_nodes
:
parent = next(G.predecessors('Group B'))
G = nx.contracted_edge(parent, 'Group B')
plt.figure(figsize=(6,6))
nx.draw(G, pos=pos,
node_color='lightgreen',
node_size=1500,
with_labels=True,
arrows=True)
我想从 networkx
中的 DiGraph
中删除一个节点,以便保留所有 child 节点并重新映射它们的边缘(或删除旧边缘 + new created) 到他们 parent 节点的 parent。节点将根据节点属性(例如它属于哪个组)被删除。
例如,我希望以编程方式删除具有属性 Group B
的节点并将所有直接 child 节点重新映射到原始 parent (在多个 grand[=27 的情况下) =]s,我想映射到所有这些)。
我可以通过遍历 DiGraph
来想到一个粗略的方法,查看它的直接后继和前任,在它们之间创建关系,然后删除节点,但也许有更优雅的方法吗?
for node in DiG.nodes(data=True):
if node[1].get('node_group') == "Group B":
pre = DiG.predecessors(node[0])
suc = DiG.successors(node[0])
for p in pre:
for s in suc:
DiG.add_edge(s, p)
DiG.remove_node(node[0])
您可以做到这一点的一种方法是确定您想要 "remove" 的节点并将它们与其前任或 "parent" 节点联系起来。 edge contraction 从图中删除一条边并合并先前连接的两个节点。
所以检查你提出的小例子:
from networkx.drawing.nx_agraph import graphviz_layout
edgelist = [('Group A', 'Group B'), ('Group B', 'Group C'),
('Group B', 'Group D'), ('Group B', 'Group E')]
G = nx.from_edgelist(edgelist, create_using=nx.DiGraph)
plt.figure(figsize=(6,6))
pos=graphviz_layout(G, prog='dot')
nx.draw(G, pos=pos,
node_color='lightgreen',
node_size=1500,
with_labels=True,
arrows=True)
现在我们可以找到有问题的节点并将 link 它们的边收缩到它的前任之一 nx.contracted_nodes
:
parent = next(G.predecessors('Group B'))
G = nx.contracted_edge(parent, 'Group B')
plt.figure(figsize=(6,6))
nx.draw(G, pos=pos,
node_color='lightgreen',
node_size=1500,
with_labels=True,
arrows=True)