从无向 networkx 图中移除自环

20

我使用networkx从节点列表创建了一个图。它有自环。如何删除自环?以下是示例:

import networkx as NX
G=NX.Graph()
G.add_edge(1,2)
G.add_edge(1,1)
print (G.edges())

[(1, 2), (1, 1)]

我不想要 (1, 1) 边。

4个回答

35

(以下是针对networkx 1.x版本的说明)

如果您正在使用networkx 2.x,请尝试:

G.remove_edges_from(nx.selfloop_edges(G))

如果您有一个 MultiGraph (例如 configuration_model 生成的), 并且使用旧版本的 2.x 存在次要错误,则此方法可能无法正常工作。 如果是这样,并且您不想升级,则需要在删除边缘之前将其转换为列表。

G.remove_edges_from(list(nx.selfloop_edges(G)))

这个 bug 已经被修复 https://github.com/networkx/networkx/issues/4068


版本 1.x(我最初回答这个问题时):

G.remove_edges_from(G.selfloop_edges())

这比我建议的更干净。如果您没有一种方法可以在生成时删除(例如,如果图形处于尴尬的文件格式中),那么就用这种方式! - Bonlenfum

14

自循环方法在2.0版本中已被弃用作为图形方法,推荐使用networkx函数。

1.x版本:

G.remove_edges_from(G.selfloop_edges())

版本 2.x:

G.remove_edges_from(nx.selfloop_edges(G))

3
之前的方法将被弃用:请使用nx.selfloop_edges()代替。

1

方法remove_edge可以满足您的需求。只需要过滤源和目标相同时的边:

for u, v in G.edges_iter():
    if u == v: 
        G.remove_edge(u,v)

你可以做的另一件事是在创建图表之前过滤输入列表。但是,您需要展示如何制作图表以展示如何过滤它。 - Bonlenfum
谢谢您的回答。这个在创建图表时有效。 - Haroon S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接