如何从 networkx 中的图形中删除 float('nan') 节点?

How to remove float('nan') node from a graph in networkx?

我有一个包含 float('nan') 的数据集(pickle 格式),我需要将其删除。

可以将 float('nan') 添加到图中作为 networkx 中的节点。但是,我不知道如何删除它。

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

CoReRank-WSDM-2019 and BirdNest.

中的代码和数据

谁能帮我解决这个问题?提前谢谢你。

我们可以在一个简单的字典上对此进行测试,它是 NetworkX 图的基础数据结构。假设您有:

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

如果我们像您尝试的那样尝试访问 NaN 密钥:

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

其核心原因是 NaN 不等于自身:

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

很好地解释了这导致查找失败的原因 here

一种解决方法,可能是遍历图形键,并识别 NaN 节点,然后 然后 使用对象的相同引用删除该键:

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