为什么NumPy浮点数没有给出ZeroDivisionError?

Gar*_*ett 5 python numpy exception

我注意到在代码中:

import numpy as np    

a = 0.0
print a / a

b = np.array( [0.0] )
print b[0] / b[0]  
Run Code Online (Sandbox Code Playgroud)

第一个打印函数抛出ZeroDivisionError,但第二个输出nan.我知道的type(b[0])numpy.float64,虽然type(a)float.我有两个问题:

1)为什么这样实现?

2)无论如何让它抛出ZeroDivisionError?

Ama*_*dan 8

我必须说,我更常感到常见的Python浮点数会引发错误.据我所知,返回NaN是正确的方法,因为在IEEE 754中定义了浮点数.

http://grouper.ieee.org/groups/754/faq.html#exceptions

为什么不将零除(或溢出或下溢)停止程序或触发错误?为什么数字标准包含"not-a-number"(NaN)?

754模型鼓励强大的计划.它不仅适用于数字分析师,也适用于电子表格用户,数据库系统甚至咖啡壶.NaNs和无穷大的传播规则允许无关紧要的异常消失.同样,逐渐下溢会在精度范围内保持误差属性.

当需要注意特殊情况时,可以通过陷阱或在方便的时候通过状态标志立即检查它们.陷阱可用于停止程序,但不可恢复的情况极为罕见.简单地停止程序不是嵌入式系统或网络代理的选项.更常见的是,陷阱记录诊断信息或替换有效结果.

标志提供可预测的控制流程和速度.它们的使用要求程序员了解异常情况,但标志粘性允许程序员在必要时延迟处理异常情况.

在处理没有这种能力的数字时,例如积分除法,错误是一种适当的响应.

  • 在754中,CPython默认启用溢出,无效操作和除0除外.大多数用户对NaN或无穷大有什么用处的想法是荒谬的,并且通过启用这3个例外,CPython确保永远不会从有限输入创建NaN或无穷大.您可能*需要*不同的行为,如果是这样,可以告诉`decimal`模块做任何事情.但Python的浮动是由平台C的"双重"实现的,甚至几十年后,对所有IEEE-754噱头的跨平台C支持仍然是一场噩梦. (2认同)

Mik*_*nor 5

要回答问题的第二部分,只需使用这个numpy 函数。

所以我遇到了你的问题,为了解决它,我只是np.seterr(all='raise')在我的import numpy as np陈述之后。

此后,我try/except围绕生成零错误的语句的块起作用了。

如果您将数组除以数组(使用 numpy 的“广播”或坐标数学方案),则此方法有效:即使只有一个除法为零,它也会引发错误。