Numpy,除以零:同一操作的两个不同结果

时间:2016-01-07 20:10:30

标签: python numpy divide-by-zero

在搜索了一下之后,我仍然在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失败的尝试。

3 个答案:

答案 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浮点数开始返回naninf而不是引发异常,所以你必须使用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

不会发生任何错误