当我过滤networkx图中的特定节点时,我想保留路径。 让我们说我有下图。
当我删除节点20 时,我想保留与下一个节点的路径或连接,因为存在通过节点20的连接。
我想要以下内容。
外面有人可以帮助我使用python应对这一挑战吗?
答案 0 :(得分:2)
对于有向图,您可以使用g.in_edges(node)
获取入射到节点的所有边,并使用g.out_edges(node)
获取所有输出边。
一旦有了这些,只需将入射边缘的源和射出边缘的目标连接起来就很简单。
无向图没有传入和传出边的概念,因此您只需组合邻居(g.neighbors
)。
最后,删除节点。
#!/usr/bin/env python
"""
Remove a node from a network while maintaining all paths.
"""
import itertools
import matplotlib.pyplot as plt
import networkx as nx
def remove_node(g, node):
if g.is_directed():
sources = [source for source, _ in g.in_edges(node)]
targets = [target for _, target in g.out_edges(node)]
else:
sources = g.neighbors(node)
targets = g.neighbors(node)
new_edges = itertools.product(sources, targets)
new_edges = [(source, target) for source, target in new_edges if source != target] # remove self-loops
g.add_edges_from(new_edges)
g.remove_node(node)
return g
if __name__ == '__main__':
edges = [(10, 20), (20, 30), (30, 40)]
g = nx.DiGraph()
g.add_edges_from(edges)
fig, (ax1, ax2) = plt.subplots(1, 2)
nx.draw_networkx(g, with_labels=True, ax=ax1)
g = remove_node(g, 20)
nx.draw_networkx(g, with_labels=True, ax=ax2)
plt.show()