【问题标题】:numpy: concise conditional syntax for array divisionnumpy:数组除法的简洁条件语法
【发布时间】:2013-01-24 03:38:13
【问题描述】:

假设一个简单的一维 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,但它只处理 if something: (do this) else: (do nothing) 场景,而我的问题是 if something: (做这个)否则:(做那个)场景。

【问题讨论】:

    标签: python syntax numpy


    【解决方案1】:

    你以后可以随时修补它:

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

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

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-07
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多