networkx:在有向无环图中收缩相邻节点
networkx: contract adjacent nodes in a directed acyclic graph
放大我的directed acyclic graph
,你会发现相邻的节点(u,v,w,x,y)
。节点w
是中心,u
和v
是upstream
,x
和y
是downstream
这导致以下边缘:
(u,w)
(v,w)
(w,x)
(w,y)
我想删除节点 w
并保留图表的流程。去掉w
后,边缘应该是
(u,x)
(u,y)
(v,x)
(v,y)
我认为 networkx.contracted_nodes(G, u, w, self_loops=False)
是正确的选择。但是根据文档,这将生成一个新节点,我们称它为 uw
边
(uw,x)
(uw,y)
(v,uw)
这改变了我的图表的行为,这不是我想要的。
有没有办法用networkx解决?
假设边是一个元组列表
def foo(arr, key):
d = {}
for a, b in arr:
d.setdefault(a, []).append(b)
if d.get(key) is None:
return arr
ans = []
fill_vals = d[key]
for a, b in arr:
if a != key:
if b != key:
ans.append((a, b))
else:
for val in fill_vals:
ans.append((a, val))
return ans
data = [("u", "w"), ("v", "w"), ("w", "x"), ("w", "y")]
foo(data, "w")
# [('u', 'x'), ('u', 'y'), ('v', 'x'), ('v', 'y')]
放大我的directed acyclic graph
,你会发现相邻的节点(u,v,w,x,y)
。节点w
是中心,u
和v
是upstream
,x
和y
是downstream
这导致以下边缘:
(u,w)
(v,w)
(w,x)
(w,y)
我想删除节点 w
并保留图表的流程。去掉w
后,边缘应该是
(u,x)
(u,y)
(v,x)
(v,y)
我认为 networkx.contracted_nodes(G, u, w, self_loops=False)
是正确的选择。但是根据文档,这将生成一个新节点,我们称它为 uw
边
(uw,x)
(uw,y)
(v,uw)
这改变了我的图表的行为,这不是我想要的。
有没有办法用networkx解决?
假设边是一个元组列表
def foo(arr, key):
d = {}
for a, b in arr:
d.setdefault(a, []).append(b)
if d.get(key) is None:
return arr
ans = []
fill_vals = d[key]
for a, b in arr:
if a != key:
if b != key:
ans.append((a, b))
else:
for val in fill_vals:
ans.append((a, val))
return ans
data = [("u", "w"), ("v", "w"), ("w", "x"), ("w", "y")]
foo(data, "w")
# [('u', 'x'), ('u', 'y'), ('v', 'x'), ('v', 'y')]