我定义了分段函数
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)
。
我不明白这种行为。
答案 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)])