Suppression des sommets qualifiants dans networkx

Tâche

Supprimons les sommets qui remplissent les conditions du graphe défini dans le programme!

Cette condition

--Utiliser networkx

Le premier programme auquel j'ai pensé

import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
G.add_nodes_from([1,2,3,4,5,6,7,8,9,10])
G.add_edges_from([(1,2),(2,4),(3,2),(4,5),(6,10),(7,6),(8,6),(9,8),(10,8),(1,9),(8,1)])

#n=G.number_of_nodes()
#[Hauts du degré 0]Ou[Un sommet de degré 1 et le côté se connectant à ce sommet]Supprimer
for v in G:
    #print(G.degree(v))
    #print("v=",v)
    G_deg=G.degree(v)
    if G_deg==0 or G_deg==1:
        G.remove_node(v)
        #print("G_deg=",G_deg)


#Sortie graphique
nx.draw_networkx(G)
plt.show()

J'ai pensé que c'était bon et l'ai essayé.

Erreur

Traceback (most recent call last):
  File "kadai06d.py", line 10, in <module>
    for v in G:
RuntimeError: dictionary changed size during iteration

Ce n'est pas simple. .. .. J'ai cherché en ligne pour trouver la cause.

Cause 1

Tout d'abord, la signification de l'erreur est ** "L'objet en cours d'itération ne peut pas être modifié" **. En d'autres termes, cela signifie-t-il que vous ne pouvez pas supprimer en boucle avec for v in G:?

Amélioration 1

Si je ne pouvais pas le supprimer à l'intérieur de for v in G, je pensais que je listerais les sommets qui remplissent les conditions, puis les supprimerais tous à la fois à l'extérieur for v in G.

Programme d'amélioration 1

import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
G.add_nodes_from([1,2,3,4,5,6,7,8,9,10])
G.add_edges_from([(1,2),(2,4),(3,2),(4,5),(6,10),(7,6),(8,6),(9,8),(10,8),(1,9),(8,1)])

node_be=G.number_of_nodes() #Nombre de sommets avant suppression
edge_be=G.number_of_edges() #Nombre de côtés avant suppression

#[Hauts du degré 0]Ou[Un sommet de degré 1 et le côté se connectant à ce sommet]Supprimer
G_rem=[]
#Lister les sommets qui remplissent les conditions
for v in G:
    G_deg=G.degree(v)
    #print("G_deg[",v,"]=",G_deg)
    if G_deg<=1:
       #print("v=",v)
       G_rem.append(v)

#Supprimer les sommets qui remplissent les conditions
G.remove_nodes_from(G_rem)

node_af=G.number_of_nodes() #Nombre de sommets après suppression
edge_af=G.number_of_edges() #Nombre de faces après suppression

#Sortie graphique
nx.draw_networkx(G)
plt.show()

J'ai essayé de l'exécuter avec ça.

Graphique exécuté

wronggraph.png \\ Il y a encore des sommets de degré 1 ///

Cause 2

Juste en regardant for v in G: une fois, il semble que v devient de plus en plus grand et même si l'ordre devient 1, il passe. En d'autres termes, vous devez regarder en arrière encore et encore, pas une fois et à la fin!

Amélioration 2

J'ai décidé de faire une double boucle pour répéter for v in G: plusieurs fois. Essayez de tourner for plusieurs fois pour le nombre de sommets.

Programme amélioré

import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
G.add_nodes_from([1,2,3,4,5,6,7,8,9,10])
G.add_edges_from([(1,2),(2,4),(3,2),(4,5),(6,10),(7,6),(8,6),(9,8),(10,8),(1,9),(8,1)])

node_be=G.number_of_nodes() #Nombre de sommets avant suppression
edge_be=G.number_of_edges() #Nombre de côtés avant suppression

#[Hauts du degré 0]Ou[Un sommet de degré 1 et le côté se connectant à ce sommet]Supprimer
G_rem=[]
#Lister les sommets qui remplissent les conditions
for i in range(node_be):
    for v in G:
        G_deg=G.degree(v)
        #print("G_deg[",v,"]=",G_deg)
        if G_deg<=1:
            #print("v=",v)
            G_rem.append(v)
    #Supprimer les sommets qui remplissent les conditions
    G.remove_nodes_from(G_rem)

node_af=G.number_of_nodes() #Nombre de sommets après suppression
edge_af=G.number_of_edges() #Nombre de faces après suppression

#Sortie graphique
nx.draw_networkx(G)
plt.savefig("output.png ")
plt.show()

Graphique exécuté

output.png Le pic du 1er ordre est parti!

finalement

J'ai trouvé que je ne pouvais pas facilement supprimer un sommet sans passer par différentes étapes. Merci jusqu'à la fin.

Recommended Posts

Suppression des sommets qualifiants dans networkx
[python] Déplacer les fichiers qui remplissent les conditions
[Introduction à Python] Comment supprimer des lignes qui remplissent plusieurs conditions dans Pandas.DataFrame
Extraire uniquement les éléments qui répondent à des conditions spécifiques en Python
[Python] Un programme qui calcule le nombre de segments de chocolat qui remplissent les conditions
Trouvez l'index des éléments qui correspondent aux conditions dans la trame / série de données pandas
Comment trouver le coefficient de la courbe approximative passant par les sommets en Python
Celui qui affiche la barre de progression en Python
Dans bash, "supprimez le fichier s'il existe".
L'histoire qui s'inscrit dans l'installation de pip
Supprimer la sous-chaîne
Extraire les lignes qui remplissent les conditions d'Excel contenant des données de date (% Y /% m /% d)
Linux est quelque chose comme ça en premier lieu
[Django] Perform Truncate Table (supprimer toutes les données de la table)
Trouvez la partie 575 de Wikipedia en Python
Modules pouvant passer par le shell en Python
L'histoire selon laquelle yapf n'a pas fonctionné avec vscode
Comment supprimer "(base)" qui apparaît dans le terminal lorsqu'Anaconda est installé sur Mac