Python 如何在NetworkX中收缩只有两条边的节点?
我在NetworkX中有一个大致如下的图表:Python 如何在NetworkX中收缩只有两条边的节点?,python,graph,networkx,Python,Graph,Networkx,我在NetworkX中有一个大致如下的图表: a---b---c---d | e---f 我想简化它,删除只有两条边的中间节点 a---b---d | f 如何在NetworkX中实现这一点?我只看到删除节点方法或收缩边。但这与节点有关。可以按如下方式进行: for node in list(G.nodes()): if G.degree(node) == 2: edges = list(G.edges(node)) G
a---b---c---d
|
e---f
我想简化它,删除只有两条边的中间节点
a---b---d
|
f
如何在NetworkX中实现这一点?我只看到删除节点方法或收缩边。但这与节点有关。可以按如下方式进行:
for node in list(G.nodes()):
if G.degree(node) == 2:
edges = list(G.edges(node))
G.add_edge(edges[0][1], edges[1][1])
G.remove_node(node)
@zohar.kom的更清晰版本将使用子图方法:
import networkx as nx
import matplotlib.pyplot as plt
graph = nx.random_graphs.watts_strogatz_graph(100, 3, .4)
threshold = 2
sub = graph.subgraph([node for node in graph.nodes() if \
graph.degree(node) != threshold])
fig, ax = plt.subplots(2, 1)
nx.draw(graph, ax = ax[0], with_labels = 1)
nx.draw(sub, ax = ax[1], with_labels = 1)
看一看:1。我假设您的意思是
[如果graph.degree(node)!=threshold,则为graph.nodes()中的节点指定节点]
,否则我们将只获取要删除的节点,而不是实际需要的节点。2.这是不够的,因为您只删除相关节点,这很好,但您还需要添加边。例如,原始示例中的边(b,f)将在该实现中丢失。ah没有正确读取它。你是对的,那么这种方法是没有意义的。谢谢你指出这一点。