numpy中"less_equal"中遇到"无效值"的原因可能是什么

Ale*_*Gao 28 python arrays numpy runtime

我经历了RuntimeWarning

 RuntimeWarning: invalid value encountered in less_equal
Run Code Online (Sandbox Code Playgroud)

由我的这行代码生成:

center_dists[j] <= center_dists[i]
Run Code Online (Sandbox Code Playgroud)

两个center_dists[j]center_dists[i]是numpy的阵列

这个警告可能是什么原因?

Div*_*kar 36

这很可能是因为np.nan涉及的输入中的某个地方.它的一个例子如下所示 -

In [1]: A = np.array([4, 2, 1])

In [2]: B = np.array([2, 2, np.nan])

In [3]: A<=B
RuntimeWarning: invalid value encountered in less_equal
Out[3]: array([False,  True, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

对于涉及的所有那些比较np.nan,它将输出False.让我们确认它进行broadcasted比较.这是一个样本 -

In [1]: A = np.array([4, 2, 1])

In [2]: B = np.array([2, 2, np.nan])

In [3]: A[:,None] <= B
RuntimeWarning: invalid value encountered in less_equal
Out[3]: 
array([[False, False, False],
       [ True,  True, False],
       [ True,  True, False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

请注意输出中的第三列,它对应于涉及第三个元素的比较np.nan,B并产生所有False值.

  • @LWZ使用这个:`warnings.filterwarnings("ignore",category = RuntimeWarning)`在脚本的顶部? (11认同)
  • 如何避免打印 RuntimeWarning?我做了很多有nan的比较,所以我不想把它们都打印出来...... (3认同)
  • 回复:`warnings.filterwarnings()`,使用`with np.errstate()` 通常更好。详情请看我的[答案](/sf/answers/3817657301/)。 (2认同)

Ulr*_*ern 8

作为Divakar的回答及其对如何抑制的评论的后续措施RuntimeWarning,一种更安全的方法是仅使用(docs在本地抑制它们:最好在与yield 进行比较时发出警告,而仅在进行比较时才忽略警告真正的目的是什么。以下是OP的示例:with np.errstate()np.nanFalse

with np.errstate(invalid='ignore'):
  center_dists[j] <= center_dists[i]
Run Code Online (Sandbox Code Playgroud)

退出该with块后,错误处理将重置为之前的状态。

取而代之的是invalid value encountered,也可以忽略所有错误all='ignore'。有趣的是kwargs,的文档中缺少np.errstate(),但是的文档中没有np.seterr()。(似乎是np.errstate()文档中的一个小错误。)