具有整数参数的分段numpy函数

时间:2014-11-21 10:55:56

标签: function integer arguments piecewise

我定义了分段函数

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)

我不明白这种行为。

3 个答案:

答案 0 :(得分:0)

似乎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])

在上面我已经显式地将结果转换为float,但是,无论显式转换如何,整数输入都会产生整数输出。我会说这是出乎意料的,我不知道为什么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中。

答案 1 :(得分:0)

我很抱歉,但是这个例子是从

中获取和修改的

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

但实际上,使用ipython和numpy 1.9

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

我没有错误,但如果我使用带有numpy 1.6的python 2.7.3,则会出现“ValueError:太多布尔索引”错误

“”” Python 2.7.3(默认,2014年2月27日,19:58:35) “”” 我在Linux和Windows下测试此功能,并发生同样的错误。

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

答案 2 :(得分:0)

此功能正常运行。

def Li(x):
  分段返回(float(x),[x&lt; 0,x&gt; = 0],[lambda:sin(t),lambda t:cos(t)])