【问题标题】:piecewise numpy function with integer arguments具有整数参数的分段 numpy 函数
【发布时间】:2015-01-19 11:58:14
【问题描述】:

我定义了分段函数

def Li(x):        
    return piecewise(x, [x < 0, x >= 0], [lambda t: sin(t), lambda t: cos(t)])

当我评估Li(1.0)

答案是正确的

Li(1.0)=array(0.5403023058681398),

但如果我写Li(1),答案是array(0)

我不明白这种行为。

【问题讨论】:

  • 我在运行任一示例时都会收到ValueError: too many boolean indices。您需要将ndarray 传递给Li()。请使用工作代码更新您的问题。

标签: function integer arguments piecewise


【解决方案1】:

这个函数运行正常。

def Li(x):        
  return  piecewise(float(x), 
                    [x < 0, x >= 0], 
                    [lambda t: sin(t), lambda t: cos(t)])

【讨论】:

  • 如果 x 应该是 np.array,它应该是 x.astype(float) 而不是 float(x)
【解决方案2】:

对不起,这个例子取自

http://docs.scipy.org/doc/numpy/reference/generated/numpy.piecewise.html

但是,事实上,在 numpy 1.9 中使用 ipython

""" Python 2.7.8 |Anaconda 2.1.0(64 位)| (默认,2014 年 8 月 21 日,18:22:21) 输入“copyright”、“credits”或“license”以获取更多信息。 IPython 2.2.0——增强的交互式 Python。 """

我没有错误,但是如果我将 python 2.7.3 与 numpy 1.6 一起使用,则会出现“ValueError: too many boolean indices”错误

""" Python 2.7.3(默认,2014 年 2 月 27 日,19:58:35) """ 我在 Linux 和 Windows 下测试了这个功能,出现同样的错误。

显然,克服这种情况很容易,但我认为 这种行为是 numpy 库中的错误。

【讨论】:

    【解决方案3】:

    似乎piecewise() 将返回值转换为与输入相同的类型,因此,当输入整数时,对结果执行整数转换,然后返回。因为正弦和余弦总是返回介于 -1 和 1 之间的值,所以所有整数转换只会产生 0、1 或 -1 - 绝大多数为 0。

    >>> x=np.array([0.9])
    >>> np.piecewise(x, [True], [float(x)])
    array([ 0.9])
    >>> x=np.array([1.0])
    >>> np.piecewise(x, [True], [float(x)])
    array([ 1.])
    >>> x=np.array([1])
    >>> np.piecewise(x, [True], [float(x)])
    array([1])
    >>> x=np.array([-1])
    >>> np.piecewise(x, [True], [float(x)])
    array([-1])
    

    在上面我已将结果显式转换为浮点数,但是,无论显式转换如何,整数输入都会导致整数输出。我会说这是出乎意料的,我不知道为什么piecewise() 应该这样做。

    我不知道您是否有更详细的想法,但是,对于这个简单的案例,您不需要piecewise();一个 if/else 就足够了:

    from math import sin, cos
    
    def Li(t):        
        return sin(t) if t < 0 else cos(t)
    
    >>> Li(0)
    1.0
    >>> Li(1)
    0.5403023058681398
    >>> Li(1.0)
    0.5403023058681398
    >>> Li(-1.0)
    -0.8414709848078965
    >>> Li(-1)
    -0.8414709848078965
    

    如果需要,您可以将返回值包装在 numpy.array 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 2018-05-31
      相关资源
      最近更新 更多