Как избежать удаления на месте модификации графика Networkx

#python-3.x #graph #networkx

#python-3.x #График #networkx

Вопрос:

У меня есть график netwrokx, я пытаюсь удалить края графика с помощью remove_edges . Я хочу удалить каждое ребро в исходном графике и выполнить постобработку H , чтобы получить дополнительную статистику, например, ребра, связанные с удаленным ребром.

 import networkx as nx
import matplotlib.pyplot as plt

# fig 1
n=10
G = nx.gnm_random_graph(n=10, m=10, seed=1)
nx.draw(G, with_labels=True)
plt.show()
for e in [[5, 0], [3, 6]]:
    H = G.remove_edge(e[0], e[1])
    nx.draw(G, with_labels=True)
    plt.show()
  

В приведенном выше примере ребро удалено на месте в G. Итак, для второй итерации исходный график не
больше не присутствует. Как этого можно избежать? Я хочу сохранить исходный график для каждой итерации и вместо этого сохранить график, который получается после удаления ребра, в другой копии, H.

Любые предложения будут высоко оценены.

РЕДАКТИРОВАТЬ: на основе того, что предложено ниже

 n=10
G = nx.gnm_random_graph(n=10, m=10, seed=1)
nx.draw(G, with_labels=True)
plt.show()
G_copy = G.copy()

for e in [[5, 0], [3, 6]]:
    print(G_copy.edges())
    H = G_copy.remove_edge(e[0], e[1])
    nx.draw(G_copy, with_labels=True)
    plt.show()
  

печать(G_copy.edges())

Полученный результат:

 [(0, 6), (0, 7), (0, 5), (1, 4), (1, 7), (1, 9), (2, 9), (3, 6), (3, 4), (6, 9)]
[(0, 6), (0, 7), (1, 4), (1, 7), (1, 9), (2, 9), (3, 6), (3, 4), (6, 9)]
  

Ожидается:

 [(0, 6), (0, 7), (0, 5), (1, 4), (1, 7), (1, 9), (2, 9), (3, 6), (3, 4), (6, 9)]
[(0, 6), (0, 7), (0, 5), (1, 4), (1, 7), (1, 9), (2, 9), (3, 6), (3, 4), (6, 9)]
  

Комментарии:

1. В вашем коде нет H .

2. @DYZ Пожалуйста, проверьте редактирование

3. G.remove_edge возвращает исходный график G , а не его копию. Смотрите мой ответ.

4. G_copy — это копия, которая изменяется в цикле. Вы печатаете его до и после модификации. Конечно, список ребер отличается. Ваш вопрос сейчас очень запутанный.

5. Спасибо за ваш ответ, я пытался заморозить модификацию в G и вместо этого сохранить измененный график в новой переменной. Теперь я понимаю, что это не работает. Запись G.remove_edges() в другой функции и передача исходного G в эту функцию помогает.

Ответ №1:

Сделайте копию исходного графика и измените копию:

 H = G.copy()
...
H.remove_edge(e[0], e[1])