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

3

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

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

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-2019BirdNest 中,有关代码和数据。

可以有人帮我解决这个问题吗?提前感谢您。


1
NaN 不等于 NaN。您可以使用 math.isnan() 来检查一个数字是否为 NaN,但我不知道是否有一种方便的方法在 networkx 中执行此操作,而无需手动循环遍历所有节点并检查它们的值。 - Niklas Mertsch
1个回答

4
我们可以在一个简单的字典上进行测试,这是 NetworkX 图的基础数据结构。假设您有以下内容:
d = {'a':3, float('nan'):4}

如果我们试图访问NaN键,就像您尝试做的那样:
d[float('nan')]
> KeyError: nan

这个核心原因是因为一个NaN不等于它本身。
>>> float("nan") == float("nan")
False

这导致查找失败的原因,在这里很好地解释了(链接)
一个解决方法是遍历图的键,识别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,))

我明白了。我将找到所有NaN节点并保存它们的引用。然后我可以调用G.remove_nodes_from()来删除它们。 - zxxml
您只能拥有一个相同节点。Nan节点不是也一样吗?@zxx上面的循环将它们全部从图中删除了。 - yatu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接