我定义了分段函数
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)
。
我不明白这种行为。
似乎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
如果需要,您可以将返回值包装在 an 中numpy.array
。
该功能运行正常。
def Li(x):
return piecewise(float(x),
[x < 0, x >= 0],
[lambda t: sin(t), lambda t: cos(t)])
对不起,这个例子取自并修改自
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:太多布尔索引”错误
""" Python 2.7.3 (default, Feb 27 2014, 19:58:35) """ 我在 Linux 和 Windows 下测试了这个函数,出现了同样的错误。
显然,克服这种情况很容易,但我认为这种行为是 numpy 库中的错误。