图中是否有消除可逆边的方法。例如,假设下面的图表
import networkx as nx
G=nx.DiGraph()
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(2,1)
G.add_edge(3,1)
print (G.edges())
[(1, 2), (2, 3), (2,1), (3,1)]
我想移除(2,1)和(3,1),因为我希望这个图只有一个方向。我知道您可以使用G.remove_edges_from(G.selfloop_edges())
删除自循环,但这里不是这样的。我正在寻找的输出将是[(1, 2), (2, 3)]
。一旦图形是由networkx或其他图形工具(如胞盘)创建的,是否有一种方法可以删除此边?
发布于 2019-04-20 14:08:26
方法1:
删除edgelist ->中的重复条目,从图->中删除所有内容,添加单边=>图
边以元组的形式存储。通过临时转换到sets,您可能丢失索引信息。然后,通过临时转换到集合,您可能会丢失重复的元组。在转换回列表之后,您将得到边列表,删除重复条目,如下所示:
stripped_list = list(set([tuple(set(edge)) for edge in G.edges()]))
然后从当前的图形中删除所有边,并将刚刚创建的列表中的边添加回:
G.remove_edges_from([e for e in G.edges()])
G.add_edges_from(stripped_list)
方法2:
查找重复边->只删除具有单边的=>图中的重复边
同样,通过转换到集合丢失位置信息:
set_list = [set(a) for a in G.edges()] # collect all edges, lose positional information
remove_list = [] # initialise
for i in range(len(set_list)):
edge = set_list.pop(0) # look at zeroth element in list:
# if there is still an edge like the current one in the list,
# add the current edge to the remove list:
if set_list.count(edge) > 0:
u,v = edge
# add the reversed edge
remove_list.append((v, u))
# alternatively, add the original edge:
# remove_list.append((u, v))
G.remove_edges_from(remove_list) # remove all edges collected above
据我所知,networkx不存储添加边的顺序,因此,除非您想要写入进一步的逻辑,否则您可以删除从数目较低的节点到具有较高数目的节点的所有重复边,或者相反。
https://stackoverflow.com/questions/55773724
复制相似问题