python - 边缘去除networkx图时如何保留路径
问题描述
当我过滤networkx图中的特定节点时,我想保留路径。假设我有以下图表。
当我删除节点 20时,我想保留与下一个节点的路径或连接,因为存在通过节点 20 的连接。
我想拥有以下内容。
任何人都可以帮助我使用 python 来应对这个挑战吗?
解决方案
对于有向图,您可以使用 获取与节点相关的所有边,使用 获取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()
推荐阅读
- python - 提高性能 - 附加列表而不是数据框
- r - 如何在 R 中使用 for 循环打印我的变量摘要输出
- javascript - 如何使用 jQuery 中的状态显示 dataTables 中的隐藏数据?
- react-native - 我将如何在我的 React Native 应用程序中制作搜索过滤器栏?
- python - 使用 cluster_centers_ 时没有获得两个坐标
- python - 如何在 locust 作为库中每秒启动新用户
- json - 从配置单元表中的 json 字符串中提取值
- python - 将权限添加到组 - Django-rest-framework
- r - geom_point 基于不同层中geom的值的条件着色
- visual-studio - Visual Studio 2015 错误 - 找不到保存的设置文件 CurrentSettings.vssettings