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

时间:2013-12-18 22:51:43

标签: python exception numpy

我在代码中注意到了:

import numpy as np    

a = 0.0
print a / a

b = np.array( [0.0] )
print b[0] / b[0]  

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

1)为什么以这种方式实施?

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

3 个答案:

答案 0 :(得分:8)

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

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

  

为什么不将零除(或溢出或下溢)停止程序或触发错误?为什么数字标准包含“非数字”(NaN)?

     

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

     

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

     

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

在处理没有此类功能的数字时,错误是一种适当的响应,例如积分除法。

答案 1 :(得分:4)

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

所以我遇到了你的问题,为了解决这个问题,我只需在np.seterr(all='raise')声明之后立即import numpy as np

此后我的try/except阻止了生成零错误的语句。

如果您将数组除以数组(使用numpy'"广播"或坐标数学方案),这种方法就有效:即使只有一个分区,它也会抛出错误是零。

答案 2 :(得分:2)

Amadan的回答是为什么会这样。如果你想要它抛出ZeroDivisionError,你可以使用

if np.isnan(x):
    raise ZeroDivisionError

其中x是您正在检查的值。但是,与其他numpy函数一样,np.isnan()将一个numpy数组作为输入,并返回一个布尔numpy数组作为输出。因此,如果您有myNumPyArray,则可以使用myNumPyArray[np.isnan(myNumPyArray]来显示所有NaN元素,或使用myNumPyArray[np.invert(np.isnan(myNumPyArray))]来显示非NaN元素