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)
。这就是你要问的吗?