3

我定义了分段函数

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)

我不明白这种行为。

4

3 回答 3

2

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

于 2014-11-21T11:19:43.627 回答
2

该功能运行正常。

def Li(x):        
  return  piecewise(float(x), 
                    [x < 0, x >= 0], 
                    [lambda t: sin(t), lambda t: cos(t)])
于 2014-11-22T20:39:50.883 回答
0

对不起,这个例子取自并修改自

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 库中的错误。

于 2014-11-21T17:17:43.730 回答