numpy 或 scipy 都有哪些可能的计算可以返回 NaN? [关闭]
Posted
技术标签:
【中文标题】numpy 或 scipy 都有哪些可能的计算可以返回 NaN? [关闭]【英文标题】:What are some possible calculations with numpy or scipy that can return a NaN? [closed]numpy 或 scipy 有哪些可能的计算可以返回 NaN? [关闭] 【发布时间】:2014-10-19 19:20:41 【问题描述】:在使用 NumPy 或 SciPy 时,在 Python 中会导致 NaN
的最常见操作有哪些?
例如:
1e500 - 1e500
>>> nan
这种行为的原因是什么,为什么它不返回 0?
【问题讨论】:
你必须比这更具体。如果您包含库(包含 numpy 标记会建议您包含),那么这是一个完全开放式的问题。从 2.6 开始,"Behavior in special cases now aims to follow C99 Annex F. In earlier versions of Python the behavior in special cases was loosely specified." 您添加了 numpy 标签,这不等于您的问题:0/0
在 Python 中引发了 ZeroDivisionError,使用 numpy(在后台使用 C),您将得到一个 NaN。跨度>
也许这个问题很宽泛,但这是一个很好的问题,因为它回答了一个经常发生的重要问题:你从代码中得到一个nan
,但你不知道为什么。如果 OP 将问题改写为在使用 numpy/scipy
时询问 nan
最常见/可能的原因是什么,而不是来自其他库,我会投票重新打开它。
我什至看不到原始问题的“过于宽泛”。获得 NaN 的方法有很多种,了解所有这些方法是一个很好的目标。据我所知,最初的问题很明确、足够狭窄且切题。
对于可能接近的选民:请在投票前访问this meta question...
【参考方案1】:
如果您在不使用浮点环境的情况下执行以下任何操作,您应该得到一个以前没有的 NaN:
0/0
(在顶部和底部签名)
inf/inf
(在顶部和底部签名)
inf - inf
或 (-inf) + inf
或 inf + (-inf)
或 (-inf) - (-inf)
0 * inf
和 inf * 0
(在两个因素上都签名)
sqrt(x)
当x < 0
fmod(x, y)
当y = 0
或x
是无限的;这里fmod
是浮点余数。
机器算术这些方面的规范参考是IEEE 754 specification。第 7.1 节描述了无效操作异常,这是在您即将获得 NaN 时引发的异常。 IEEE 754 中的“异常”与编程语言上下文中的含义不同。
许多特殊的函数实现记录了它们在尝试实现的函数的奇异点处的行为。例如,请参阅 atan2
和 log
的手册页。
您具体询问的是 NumPy 和 SciPy。我不确定这是否只是简单地说“我在询问 NumPy 引擎盖下发生的机器算法”还是“我在询问 eig()
之类的东西”。我假设是前者,但这个答案的其余部分试图与 NumPy 中的高级函数建立模糊的联系。基本规则是:如果一个函数的实现犯了上述罪过之一,你会得到一个 NaN。
例如,对于fft
,如果您的输入值约为1e1010
或更大,您很可能会得到NaN
s,如果您的输入值约为1e-1010
或更小,则精度会无声地损失。不过,除了真正可笑的缩放输入之外,使用fft
是相当安全的。
对于涉及矩阵数学的事情,如果您的数字很大或您的矩阵非常病态,NaN 可能会突然出现(通常通过inf - inf
路由)。关于如何被数值线性代数搞砸的完整讨论太长了,不属于答案。我建议您花几个月的时间阅读一本数值线性代数书(Trefethen 和 Bau 很受欢迎)。
在编写和调试“不应”生成 NaN 的代码时,我发现有用的一件事是告诉机器在发生 NaN 时进行陷阱。在 GNU C 中,我这样做:
#include <fenv.h>
feenableexcept(FE_INVALID);
【讨论】:
不要忘记那些显而易见的...nan + <anything>
、nan * <anything>
等(当然,您确实说过“以前没有的地方”,不包括那些。仍然可能值得明确提及 nan 通过任何计算传播。)
@JoeKington:是的,我的措辞很烂。不过,这就是我的意思;感谢您的澄清。
这是指哪个版本的 Python?在 Python 2.7.11 和 Python 3.5.1 上除以 0/0 时出现 ZeroDivisionError。 0.0 / 0.0 也是如此。
@tba:这是一个 numpy 问题。
还有 np.arscin(-2) 或在定义之外调用的所有其他函数以上是关于numpy 或 scipy 都有哪些可能的计算可以返回 NaN? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章