在搜索了一下之后,我仍然在numpy中零分挣扎。 我对我立即报告的矛盾感到震惊:
from numpy import *
seterr(all='ignore') # Trying to avoid ZeroDivisionError, but unsuccessful.
def f(x) :
return 1./(x-1.)
有了这个,当我执行f(1.)
时,我得到了
ZeroDivisionError: float division by zero
。
但是,当我定义时
z = array( [ 1., 1. ] )
并执行f(z)
,我没有收到任何错误,但是
array([ inf, inf])
。
正如您所看到的,两种产出之间存在着一种矛盾。 我的第一个问题就是原因。
理想情况下,我希望将inf
作为f(1.)
的输出,或至少nan
,但不是错误(因此计算的停止)。
我的第二个问题是如何管理它的。
请注意我使用seterr
失败的尝试。
答案 0 :(得分:2)
1.
是一个普通的Python浮点数,它们引发异常而不是使用nan / inf。当你致电f(1.)
时,numpy不会以任何方式参与。只做from numpy import *
(或调用像seterr
这样的numpy函数)并没有改变普通Python类型的工作方式;它只会影响numpy对象的操作,如果你明确创建它们,你只会得到numpy对象。
当你做显式创建一个numpy对象时,就像在f(z)
示例中一样,你涉及numpy,它有自己的类型,与基本的Python类型不同。值得注意的是,numpy数字类型做使用nan / inf。
据我所知,没有办法让普通的Python浮点数开始返回nan
或inf
而不是引发异常,所以你必须使用numpy标量而不是普通的Python浮动(如this question中所述),如果你想支持标量和向量操作。
答案 1 :(得分:1)
Numpy不参与您的职能f
。如果要更改输出,则必须捕获ZeroDivisionError
。
import numpy
def f(x) :
try:
return 1./(x-1.)
except ZeroDivisionError:
return numpy.nan
或者使用numpy的分部:
import numpy
def f(x) :
return numpy.divide(1., (x-1.))
或者只将numpy类型传递给f
:
import numpy
def f(x) :
return 1./(x-1.)
x = numpy.float_(1)
print f(x) # prints inf
答案 2 :(得分:0)
看起来seterr
旨在与Numpy类型一起使用;它如何与Python本机类型一起使用。另一方面,如果你这样做:
f(np.array((1,)))
seterr
。