numpy:数组除法的简明条件语法

时间:2013-01-24 03:38:13

标签: python syntax numpy

假设一个简单的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场景出现。虽然我知道这可以使用循环来完成,但我想知道这种操作是否有任何惯用语法。

有一个相关的问题here,但它只处理如果有的话:(执行此操作)else :(什么也不做)场景,而我的问题是如果有的话:(做这个)其他:(做那个)场景。

2 个答案:

答案 0 :(得分:3)

您可以随时修补它:

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

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

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

答案 1 :(得分:2)

在前一个答案的基础上,您还可以设置浮点回调模式,以检测何时需要应用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