1

假设一个简单的一维 numpy 数组:

>>> x = np.array([1,3,5,0,3,2])

现在假设我要执行操作1.0/x。我可以用 numpy 做到这一点:

>>> 1.0/x
array([ 1.        ,  0.33333333,  0.2       ,         inf,  0.33333333,
    0.5       ])

这里的问题是原始元素值 0 的无穷大 ( inf) 结果,因为1.0/0似乎返回无穷大来代替未定义的行为。

我想提供我自己的自定义值,而不是无穷大,在这些除以 0 的情况下出现。虽然我知道这可以使用循环来完成,但我想知道这种操作是否有任何惯用语法。

这里有一个相关的问题,但它只处理if something: (do this) else: (do nothing)场景,而我的问题是if something: (do this) else: (do that)场景。

4

2 回答 2

4

您以后可以随时对其进行修补:

a = 1.0/x
inf_ind = np.isinf(a)
a[inf_ind] = your_value

或者

a[inf_ind] = f(x[inf_ind])

其优点是不会妨碍漂亮的优化 numpy 方法。

于 2013-01-24T03:40:56.607 回答
3

基于上一个答案,您还可以设置浮点回调模式以检测何时需要应用 inf 转换。

但是,我找不到在每个浮点错误上调用的回调。

另见: http ://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html

import numpy
class IsDivideError(object):
    def __init__(self):
        self.hasDivideError=False

    def callback(self, x,y):
        self.hasDivideError=True

ide=IsDivideError()
numpy.seterr(divide='call')
numpy.seterrcall(lambda x,y: ide.callback(x,y) )
x = numpy.array([1,3,5,0,3,2])
val=1.0/x
if(ide.hasDivideError):
    val[numpy.isinf(val)]=5
于 2013-01-24T03:57:57.193 回答