无法识别类型为 float 的 Numpy 数组中的 None 元素

Not being able to identify None element in Numpy array of type float

这些是我所做的尝试:

series1 = np.array([1, 3, None, None, 5]).astype(np.float)
print(series1)
for i in range(series1.shape[0]):
    if series1[i] == None:
        print(series1[i])
    if series1[i] == 'None':
        print(i)
    try:
        if series1[i] == nan:
            print(series1[i])
    except NameError:
        pass
    if series1[i] == 'nan':
        print(series1[i])

给出输出

[ 1.  3. nan nan  5.]

我需要 if 语句来识别 Numpy 数组中元素的位置 None。但我想不出除了上面代码中的内容之外的任何内容。当我不提供 .astype(np.float) 命令时它会工作,它打印出 None,但我需要元素是 float

TL;DR 使用

import math
...
   if math.isnan(series1[i]):
      ...

nan 是一个特殊的浮点值,表示该数字不是有效值 - 它表示不是数字。它不同于 None,它是一个 Python 对象 - 不是浮点数,也不是数值。

Numpy 在创建数组时会将 None 转换为 nans,这没关系——它们的语义是相同的。除了从 None 转换之外,某些算术结果也可能导致 NaN,例如无穷大除以无穷大,或者在数组操作中引发零除法或其他无效操作的异常会破坏所有程序流程。

但是,nans 只能通过某些专门的方式检测。比较不是其中之一 - 它是 Python 中唯一的常规对象,它通过 == 比较与自身进行比较。 (即:nan == nan 结果为 False)。

然后,您试图将您的浮点值与 'None''nan' 进行比较:以这种方式引用的是文本字符串 - 组成名称的字符,而不是特殊的 Python 个对象。

在常规 Python 中检查 nan 的正确方法是使用 math.isnan(value) (您必须先 import math 这样做)。它returns True or False,可以直接用在if语句中。

如果您在某些时候使用 NumPy 的矢量函数,而不是使用外部 Python for,则有 numpy.isnan 调用。