- 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/
我正在尝试使用 flot 绘制 SQL 数据库中的数据图表,这是使用 php 收集的,然后使用 json 编码的。 目前看起来像: [{"month":"February","data":482},
我有一个来自 php 行的 json 结果,类似于 ["value"]["value"] 我尝试使用内爆函数,但得到的结果是“value”“value” |id_kategori|created_at
脚本 1 将记录 two 但浏览器仍会将 select 元素呈现为 One。该表单还将提交值 one。 脚本 2 将记录、呈现和提交 两个。我希望它们是同义词并做同样的事情。请解释它们为何不同,以及我
我的python字典结构是这样的: ips[host][ip] 每行 ips[host][ip] 看起来像这样: [host, ip, network, mask, broadcast, mac, g
在 C# 中 我正在关注的一本书对设置和获取属性提出了这样的建议: double pri_test; public double Test { get { return pri_test; }
您可能熟悉 enum 位掩码方案,例如: enum Flags { FLAG1 = 0x1, FLAG2 = 0x2, FLAG3 = 0x4, FLAG4 = 0x8
在一些地方我看到了(String)value。在一些地方value.toString() 这两者有什么区别,在什么情况下我需要使用哪一个。 new Long(value) 和 (Long)value
有没有什么时候 var result = !value ? null : value[0]; 不会等同于 var result = value ? value[0] : null; 最佳答案 在此处将
我正在使用扫描仪检测设备。目前,我的条形码的值为 2345345 A1。因此,当我扫描到记事本或文本编辑器时,输出将类似于 2345345 A1,这是正确的条形码值。 问题是: 当我第一次将条形码扫描
我正在读取 C# 中的资源文件并将其转换为 JSON 字符串格式。现在我想将该 JSON 字符串的值转换为键。 例子, [ { "key": "CreateAccount", "text":
我有以下问题: 我有一个数据框,最多可能有 600 万行左右。此数据框中的一列包含某些 ID。 ID NaN NaN D1 D1 D1 NaN D1 D1 NaN NaN NaN NaN D2 NaN
import java.util.*; import java.lang.*; class Main { public static void main (String[] args) thr
我目前正在开发我的应用程序,使其设计基于 Holo 主题。在全局范围内我想做的是工作,但我对文件夹 values、values-v11 和 values-v14. 所以我知道: values 的目标是
我遇到了一个非常奇怪的问题。 我的公司为我们的各种 Assets 使用集中式用户注册网络服务。我们一般通过HttpURLConnection使用请求方法GET向Web服务发送请求,通过qs设置参数。这
查询: UPDATE nominees SET votes = ( SELECT votes FROM nominees WHERE ID =1 ) +1 错误: You can't specify
如果我运行一段代码: obj = {}; obj['number'] = 1; obj['expressionS'] = 'Sin(0.5 * c1)'; obj['c
我正在为我的应用创建一个带有 Twitter 帐户的登录页面。当我构建我的项目时会发生上述错误。 values/strings.xml @dimen/abc_text_size_medium
我在搜索引擎中使用以下 View : CREATE VIEW msr_joined_view AS SELECT table1.id AS msr_id, table1.msr_number, tab
为什么验证会返回此错误。如何解决? ul#navigation li#navigation-3 a.current Value Error : background-position Too
我有一个数据名如下 import pandas as pd d = { 'Name' : ['James', 'John', 'Peter', 'Thomas', 'Jacob', 'Andr
我是一名优秀的程序员,十分优秀!