Как свернуть узлы, которые имеют только 2 ребра в NetworkX? - PullRequest
0 голосов
/ 21 января 2019

У меня есть график в NetworkX, который примерно такой:

a---b---c---d
    |
    e---f

Я хочу упростить его, удалив промежуточные узлы, которые имеют только 2 ребра.

a---b---d
    |
    f

Как можноэто должно быть сделано в NetworkX?Я вижу только методы удаления узлов или контрактные ребра.Но это связано с узлами.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Более чистая версия @ 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)

enter image description here

0 голосов
/ 21 января 2019

Это можно сделать следующим образом:

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)
...