Python 用后续边替换networkx图中节点的有效方法

Python 用后续边替换networkx图中节点的有效方法,python,replace,networkx,Python,Replace,Networkx,我正在尝试用贯穿边替换图中的节点。这意味着被替换/移除节点的每个前置节点将连接到被替换/移除节点的每个后续节点 例如,考虑一个具有5个节点的路径图,其中边(0,1)、(1,2)、(2,3)、(3,4),我希望用后续边替换节点1和3((0,2),对于节点1)和((2,4),对于节点3)。最后的图形应该有边(0,2)、(2,4)Networkx没有内置的函数/算法,因此您应该手动执行。模块将帮助您自动构建边,以创建: import itertools as it import networkx as

我正在尝试用贯穿边替换图中的节点。这意味着被替换/移除节点的每个前置节点将连接到被替换/移除节点的每个后续节点


例如,考虑一个具有5个节点的路径图,其中边
(0,1)、(1,2)、(2,3)、(3,4)
,我希望用后续边替换节点1和3(
(0,2)
,对于节点1)和(
(2,4)
,对于节点3)。最后的图形应该有边
(0,2)、(2,4)

Networkx没有内置的函数/算法,因此您应该手动执行。模块将帮助您自动构建边,以创建:

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中是否存在更有效的方法。在
networkx
中,您应该检查每个节点的前置/后继节点,这样O复杂度无论如何都是相同的。

我怀疑您会发现任何networkx魔术比您前面描述的“幼稚”方式快得多(从每个前置节点向每个后继节点添加边并删除节点)。不过,
itertools.product
是您在这里的朋友。假设这些都是单打(你会删除1和2并用3替换吗?这是不同的算法…)这就是我的想法。我猜这是一个不适用于大多数用户的特定用例,因此可能不包括在内。在我的用例中,我确定所有不应该被替换的节点,其余的节点必须被替换为贯穿边。因此,我可能需要删除1和2以获得
(0,3)、(3,4)
。这就是你要问的吗?