- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在一段测试代码中遇到了 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/
是否可以确定性地运行多线程Java应用程序?我的意思是在我的应用程序的两次不同运行中始终具有相同的线程切换。 原因是在每次运行中都在完全相同的条件下运行模拟。 类似的情况是当使用随机数生成器获得始终相
这是否可能以确定性方式运行多线程 Java 应用程序?我的意思是在我的应用程序的两次不同运行中始终进行相同的线程切换。 这样做的原因是每次运行都在完全相同的条件下运行模拟。 类似的情况是当一个人在使用
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 2 年前。 Improv
我正在寻找一种以特定间隔滚动水平菜单的方法。 我有多个 child 在屏幕上可见 选中的状态在中心。 将 snapToInterval 与 snapToAlignement 结合使用完全满足了我的需求
我正在编写一个使用 Rcpp 包的 R 包。到目前为止,我一直在使用 R 版本 4.0.0 的 macOS Catalina 上工作和测试。使用 set.seed从 R 中,我可以从我的 Mac 获得
我正在尝试将一段基于 Dave Shapiro 的“RSA in Javascript”库 (http://ohdave.com/rsa/) 的 JS 代码转换为 PHP(我正在尝试为使用 JS 加密
我正在尝试在 this page 上重现第二个示例Eigen 文档,但无法编译我的最小程序。我正在使用 Eigen 3.3~beta1-2。 使用以下参数运行 g++ 时 -std=c++11 -Wa
我几天来一直在尝试仅使用 Canvas API 以及 getImageData 和 putImageData 来重现图像,遵循我在网上找到的一些教程。使用正方形或从 Canvas 上绘制的任何其他形式
我不完全确定 Docker 是否足以用于 R 开发,或者我应该与 Packrat 结合使用。我读过几篇文章说 docker 就足够了。唯一支持这种说法的地方是这个 post .但是,由于 git2r
在 official Guava's TypeToken wiki ,有下面的例子: Invokable, ?> invokable = new TypeToken>() {}.method(getM
我在一段测试代码中遇到了 FloatingPointError: invalid value encountered in subtract。在代码本身没有进行任何更改的情况下开始引发异常,因此我很难
这个问题已经有答案了: Comparison method violates its general contract Exception (1 个回答) 已关闭10 年前。 我正在尝试重现此异常(j
这本书JavaScript for PHP Developers包含以下注释代码(至我添加了alert()来显示单变量表达式语句的值形式 variable; 并且我还添加了“use strict”指令
我将为我的一个元素制作一个 jQuery 插件,我正在尝试使用 div 和 span 模拟输入以使其“更丰富”。 我将使用 [span(包含用于删除的 A)+ input] 而不是 [ input ]
我的build.gradle.kts(:app): plugins { id("com.android.application") kotlin("plugin.serializati
问题 我有一些 code每月创建一个包含许多点的 map ,并用一些统计数据进行注释。在我将 ggplot2 更新为 3.3.6 之前,此方法运行良好,之后绘图已损坏,我无法找出解决方案。据我所知,问
我正在尝试最小化一个函数,该函数采用长度为 N 的 1darray 并通过 Levenberg-Marquardt (:= LM) 返回标量。 它可以在 Matlab 中运行: beta_initia
我在本地有这个 Nodejs Typescript Azure 函数: ├── README.md ├── dist ├── host.json ├── local.settings.json ├─
我想创建一个 64 位 ASP.NET MVC 2 Web 应用程序并使用 64 位类库引用它。但是这样做我得到了一个“System.BadImageFormatException”-Exceptio
有人给我一些入门建议吗?我想从中吸取教训(即不想偷懒,不想让别人帮我回答这个问题)。 我想加深对数学 3D 曲面的理解。我自己的个人项目是在 MATLAB 中生成大厅结构的 3D 表面/图形。 我找到
我是一名优秀的程序员,十分优秀!