我在代码中注意到了:
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?
答案 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元素