【问题标题】:Why do "Not a Number" values equal True when cast as boolean in Python/Numpy?为什么在 Python/Numpy 中将“非数字”值转换为布尔值时等于 True?
【发布时间】:2013-03-28 15:49:03
【问题描述】:

当将 NumPy Not-a-Number 值转换为布尔值时,它变为 True,例如如下。

>>> import numpy as np
>>> bool(np.nan)
True

这与我的直觉预期完全相反。这种行为背后是否有合理的原则?

(我怀疑在 Octave 中可能会出现相同的行为。)

【问题讨论】:

  • 我的预感:NaN 不等于 0,所以转换为布尔值时是真的。如果 NaN 为假,则将浮点数转换为布尔值将进行两次检查,一次检查零,一次检查 NaN。 (但我怀疑将 Numpy 浮点数解释为布尔值并不是常见的做法......)
  • C(NumPy 所基于)中也是如此。来自标准:When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.脚注59明确指出NaNs do not compare equal to 0 and thus convert to 1.

标签: python math numpy


【解决方案1】:

这绝不是 NumPy 特有的,但与 Python 处理 NaN 的方式一致:

In [1]: bool(float('nan'))
Out[1]: True

规则在documentation中详细说明。

我认为有理由认为 NaN 的真值应该是 False。但是,这不是该语言目前的工作方式。

【讨论】:

  • TL;链接文档的 DR:Python 将所有内容视为 True,除非它是特别定义的错误情况之一(例如,NoneFalse、数字零、空序列、用户定义的类返回其中之一,等等)。
  • 我认为它应该是所有类型的 NaN。也就是说,布尔值应该有一个 NaN 值。 NaN 永远不应转换为有效值。
【解决方案2】:

Python truth-value testing 声明以下值被视为False

  • 任何数字类型的零,例如,0、0L、0.0、0j。

Numpy 可能选择坚持这种行为并阻止 NaN 在布尔上下文中评估为 False。但请注意,您可以使用 numpy.isnan 来测试 NaN。

【讨论】:

    【解决方案3】:

    0.0 是唯一虚假的浮点值,因为这是语言设计者认为最有用的值。 Numpy 只是跟随。 (当bool(float('nan'))True 时,bool(np.nan)False 会很奇怪)。

    我认为这可能是因为整数就是这样工作的。诚然,整数没有 NaN 或 inf 类型的值,但我认为特殊情况还不足以打破规则。

    【讨论】:

    • 这不取决于语言设计者; Numpy 的人也可以决定将 nan 设为 false。
    • @larsmans -- 很公平。我没有注意到 numpy 是 OP 问题的一部分。不过,我认为这并没有真正改变任何事情。 numpy 做 python 做的事情才有意义。
    • 应该注意 -0.0 也是 False。起初这可能不是一件小事。
    【解决方案4】:

    Numpy 在此处遵循 python standard for truth testing,任何数值类型的计算结果为 False 当且仅当其数值为零时。

    请注意,使用 NaN 值的真值测试在其他方面也可能不直观(例如,nan == nan 的计算结果为 False)。

    【讨论】:

    • 我认为您的意思是“...计算为 False 如果 ...”
    • @Warren -- 确实!谢谢。
    【解决方案5】:

    这通常在测试np.nan 的变量时需要。虽然np.nan is not np.nan 失败(评估为False),但np.isnan 函数有效(评估为True,因此可用于测试np.nan):

    np.isnan(np.nan)

    是的

    【讨论】:

      猜你喜欢
      • 2016-02-01
      • 2017-12-07
      • 2011-04-27
      • 2020-03-08
      • 2016-02-27
      • 2019-02-24
      • 2017-03-07
      • 2020-11-27
      • 1970-01-01
      相关资源
      最近更新 更多