2 votes

Comment supprimer un noeud float('nan') d'un graphe dans networkx ?

J'ai un jeu de données (format pickle) contenant float('nan') et je dois l'enlever.

Il est possible d'ajouter float('nan') à un graphe en tant que nœud du réseaux. Cependant, je ne sais pas comment le supprimer.

import networkx as nx
G = nx.Graph()
G.add_node(float('nan'))
print(G.nodes) # [nan], so there is float('nan') in the graph
G.remove_node(float('nan')) # this statement raise a NetworkxError showing nan not in the graph

Code et données en CoReRank-WSDM-2019 y Nid d'oiseau .

Quelqu'un peut-il m'aider à résoudre ce problème ? Je vous remercie d'avance.

2voto

yatu Points 39897

Nous pouvons tester ceci sur un simple dictionnaire, qui est la structure de données sous-jacente d'un graphe NetworkX. Supposons que vous ayez :

d = {'a':3, float('nan'):4}

Si nous essayons d'accéder au NaN comme vous essayez de le faire :

d[float('nan')]
> KeyError: nan

La cause principale de ce phénomène s'explique par le fait qu'un NaN n'est pas égal à lui-même :

>>> float("nan") == float("nan")
False

La raison pour laquelle cela fait échouer la recherche est joliment expliquée aquí .

Une solution de contournement pourrait consister à parcourir en boucle les clés du graphe et à identifier les NaN et puis supprimer cette clé en utilisant la même référence de l'objet :

import math

G = nx.Graph()
G.add_node(float('nan'))
G.add_node(3)
print(G.nodes) 
# [nan, 3]

nan_nodes = []
for node in G.nodes():
    if math.isnan(node):
        nan_nodes.append(node)
G.remove_nodes_from(nan_nodes)

G.nodes()
# NodeView((3,))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X