gpt4 book ai didi

python - numpy 浮点错误 : invalid value encountered in subtract - not reproducible?

转载 作者:太空狗 更新时间:2023-10-30 01:29:55 25 4
gpt4 key购买 nike

我在一段测试代码中遇到了 FloatingPointError: invalid value encountered in subtract。在代码本身没有进行任何更改的情况下开始引发异常,因此我很难理解它。

我的问题:是什么导致了 invalid value encountered in subtract 异常?为什么它在不同的 python+numpy 安装上表现不同?

详情:

此 MWE 不会引发FloatingPointError:

>>> import numpy as np
>>> np.__version__
'1.6.1'
>>> x = np.arange(5,dtype='float64')
>>> y = np.ones(5,dtype='float64')
>>> x[2]=np.nan
>>> x-y
# array([ -1., 0., nan, 2., 3.])

然而,在一段代码的深处,我减去两个 np.float64 ndarray 对象,并得到一个浮点异常。导致异常的数组包含一些非常大和非常小的数字(例如 1e307 和 1e-307)和一些 nan,但我没有对这些数字进行任何组合导致异常测试我自己的。

更令人不安的是,我有一个大型的 Jenkins 测试网格,使用许多版本的 numpy、matplotlib、python 和 scipy 运行完全相同的代码,但没有一个会引发此异常。我现在迷路了——我不知道是否有错误,或者如果有,如何追踪它。

如果你病态地好奇,有问题的代码是pyspeckit并且测试在 test_hr2421.py 的第 20 行失败。

编辑:跟进 - 我认为这个小片段:np.seterr(invalid='raise') 在我导入的模块中被调用,特别是 pymc,并且拉取请求有因为阻止了此更改。

最佳答案

Numpy 具有关于如何处理浮点错误的可配置行为。默认情况下,下溢错误会被忽略,而其他错误会触发警告。对于每个类别,用户可以使用 numpy.seterr 更改此行为。这些设置是全局的——这里没有命名空间;因此,如果库调用 numpy.seterr(all='raise') 那么这将影响整个程序,直到再次调用 numpy.seterr

您可以确认这确实是您问题的原因

print(numpy.seterr())

应该输出类似的东西

{'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}

如果其中一些类别具有值 raise,特别是键 'invalid',那么这将解释您观察到的行为。

您可以通过调用 numpy.seterr(invalid='warn')invalid='ignore' 来抑制此异常。有关可能错误的完整列表,请通读 numpy.seterr 的文档.

您还可以使用上下文管理器来临时更改行为:

In [12]: x = np.arange(-5, 5,dtype='float64')

In [13]: with np.errstate(divide="raise"):
print(1/x)
....:
---------------------------------------------------------------------------
FloatingPointError Traceback (most recent call last)
<ipython-input-13-881589fdcb7a> in <module>()
1 with np.errstate(divide="raise"):
----> 2 print(1/x)
3

FloatingPointError: divide by zero encountered in true_divide

In [14]: with np.errstate(divide="warn"):
print(1/x)
....:
/home/users/gholl/venv/stable-3.5/bin/ipython3:2: RuntimeWarning: divide by zero encountered in true_divide

[-0.2 -0.25 -0.33333333 -0.5 -1. inf
1. 0.5 0.33333333 0.25 ]

In [15]: with np.errstate(divide="ignore"):
print(1/x)
....:
[-0.2 -0.25 -0.33333333 -0.5 -1. inf
1. 0.5 0.33333333 0.25 ]

我倾向于将我的整个代码包装在 with np.errstate(all="raise") block 中,然后使用上下文管理器忽略特定条件,如果我确定问题所在并没有隐藏错误——不过通常是这样。

如果确实有库永久更改状态,我会向维护者提出问题或发送拉取请求,因为他们确实应该使用上下文管理器,以便他们更改的设置仅适用于他们的代码块而不是程序的其余部分。

关于python - numpy 浮点错误 : invalid value encountered in subtract - not reproducible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12041982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com