从有向图网络x上删除可逆边

时间:2019-04-20 12:56:49

标签: python graph networkx

有没有一种方法可以消除图形中的可逆边缘。例如,假设下图

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或其他图工具(例如cytoscape)创建了图,是否可以删除这些边缘?

1 个答案:

答案 0 :(得分:0)

方法1:

删除边缘列表中的重复条目->从图形中删除所有内容->添加单个边缘=>具有单个边缘的图形

边存储为元组。您可能会通过临时转换为集合而丢失索引信息。然后,通过临时转换为集合,您可能会丢失重复的元组。转换回列表后,您将获得边列表,并删除了重复的条目,如下所示:

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:

查找重复边->仅从graph =>具有单个边的图中删除那些边

再次,通过转换为集合而丢失位置信息:

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不会存储添加边的顺序,因此除非您要编写进一步的逻辑,否则您将删除所有重复的边(从编号较小的节点到编号较大的节点),或者反过来。