簡體   English   中英

為什么 `np.sum([-np.Inf, +np.Inf])` 警告“在 reduce 中遇到無效值”

[英]Why does `np.sum([-np.Inf, +np.Inf])` warn about "invalid value encountered in reduce"

python -c "import numpy as np; print(np.sum([-np.Inf, +np.Inf]))" 

numpy\core\fromnumeric.py:86: RuntimeWarning: invalid value encountered in reduce
  return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
nan

我不知道這是為什么:

  1. 里面沒有警告

    python -c "import numpy as np; print(np.sum([-np.Inf, -np.Inf]))"

    也不在

    python -c "import numpy as np; print(np.sum([+np.Inf, +np.Inf]))"

    所以它不可能是Inf s。

  2. 里面沒有警告

    python -c "import numpy as np; print(np.sum([np.nan, np.nan]))"

    所以它不可能是NaN結果。

那么,它是什么,我該如何避免呢? 我實際上喜歡得到NaN結果,我只是想避免警告。

警告很好,因為Inf - Inf在數學上未定義。 你期望什么結果?

如果您想避免警告,請使用如下過濾器:

import warnings

with warnings.catch_warnings():
    warnings.simplefilter("ignore", category=RuntimeWarning)
    res = np.sum([-np.Inf, np.Inf])

事實證明,@CarlosHorn 的答案非常接近,盡管隱藏在 IEEE 標准 754 的深處(我檢查了 2008 版本)。

第 7.2 節(默認異常處理 > 無效操作)寫道

當且僅當沒有有用的可定義結果時,才會發出無效操作異常信號。

考慮到有些人可能覺得Inf沒有用,我不知道什么是“有用的可定義結果”; 相比之下,我發現甚至NaN也很有用。 不管怎樣,本節給出了一個完整的示例列表,其中包括(在 d 中)“無窮大的減法”,解釋了 Inf 的原因和形式Inf - Inf應被視為無效。 它還包括(在 a 中)“對信號 NaN 的任何 [...] 操作”,但不包括對安靜 NaN 的操作。 這個重要的區別解釋了為什么NaN + NaN通常不發出信號,因為np.nan是安靜的。

為了完整起見,第 6.1 節解釋了為什么Inf + Inf不應被視為無效。

還有兩件事要說:

  • 我不清楚(但無關緊要)為什么np.inf - np.inf不會引發異常。
  • with np.errstate(invalid="ignore"): ...可能是抑制警告的最干凈的方法。

更多資源:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM