首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从有向图网络中删除可逆边

从有向图网络中删除可逆边
EN

Stack Overflow用户
提问于 2019-04-20 12:56:48
回答 1查看 1.4K关注 0票数 0

图中是否有消除可逆边的方法。例如,假设下面的图表

代码语言:javascript
运行
复制
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或其他图形工具(如胞盘)创建的,是否有一种方法可以删除此边?

EN

回答 1

Stack Overflow用户

发布于 2019-04-20 14:08:26

方法1:

删除edgelist ->中的重复条目,从图->中删除所有内容,添加单边=>图

边以元组的形式存储。通过临时转换到sets,您可能丢失索引信息。然后,通过临时转换到集合,您可能会丢失重复的元组。在转换回列表之后,您将得到边列表,删除重复条目,如下所示:

代码语言:javascript
运行
复制
stripped_list = list(set([tuple(set(edge)) for edge in G.edges()]))

然后从当前的图形中删除所有边,并将刚刚创建的列表中的边添加回:

代码语言:javascript
运行
复制
G.remove_edges_from([e for e in G.edges()])
G.add_edges_from(stripped_list)

方法2:

查找重复边->只删除具有单边的=>图中的重复边

同样,通过转换到集合丢失位置信息:

代码语言:javascript
运行
复制
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不存储添加边的顺序,因此,除非您想要写入进一步的逻辑,否则您可以删除从数目较低的节点到具有较高数目的节点的所有重复边,或者相反。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55773724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档