我试图用后面的边缘替换图中的节点。这意味着,替换/删除节点的每个前身将连接到替换/删除节点的每个后继产品。
例如,考虑一个带有5个节点的路径图,例如边缘(0, 1), (1, 2), (2, 3), (3, 4)
,我希望用后续边缘(节点1的(0,2)
(和(节点3的(2,4)
(替换节点1和3。最终图应具有边缘(0, 2), (2, 4)
。
NetworkX没有内置函数/算法,因此您应该手动进行操作。Itertools模块将帮助您自动化边缘的构造以创建:
import itertools as it
import networkx as nx
G = nx.DiGraph()
G.add_edges_from([
(1,2),
(2,3),
(3,5),
(4,5),
(5,6),
(5,7)
])
nodes_to_delete = [2, 5]
for node in nodes_to_delete:
G.add_edges_from(
it.product(
G.predecessors(node),
G.successors(node)
)
)
G.remove_node(node)
因此,G.edges
将返回所需的边缘(1->2->3
移至1->3
,3,4,6,7
成对连接(:
OutEdgeView([(1, 3), (3, 6), (3, 7), (4, 6), (4, 7)])
p.s。我怀疑网络中更有效的方法是否存在。在networkx
中,您应该检查每个节点的前任/后继产品,以便O-complexity无论如何都相同。