我正在尝试构建一个用于某些数字信号处理的分段函数,但我无法通过numpy.piecewise来指定范围。
这是我想要输入的内容:
t = np.arange(-10,10,1)
x = lambda x: x**3
fx = np.piecewise(t, [t < -1 and t>-2, t <= 0 and t>-1, t>=0 and t<1,t>1 and t<2], [x(t + 2), x(-t),x(t),-x(2-t)])
plot(t,fx)
但是,我得到错误:“ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()”
在剖析函数之后,似乎问题是这个函数不会允许2个条件,例如:
t < -1 and t>-2
但在我看来,允许指定范围对于许多分段函数是必不可少的。有没有办法实现这个目标?
谢谢!
答案 0 :(得分:5)
这是因为你不能在numpy数组上使用和。对于numpy布尔数组,您需要将and
替换为*
,将or
替换为+
。 (并且不要忘记添加括号)。
答案 1 :(得分:3)
另一个问题是,添加到Nicolas的答案中,如果你想使用funclist
,piecewise
的每个元素都必须是可调用的。您更正的代码看起来像
t = np.arange(-2,2,.01)
f1 = lambda t: (t+2)**3
f2 = lambda t: (-t)**3
f3 = lambda t: (t)**3
f4 = lambda t: -(2-t)**3
fx = np.piecewise(t, [(t< -1)*(t>=-2), (t <= 0) * (t>=-1), (t>0) * (t<1),(t>=1) * (t<=2)], [f1,f2,f3,f4])
plot(t,fx)
相反,您可以使用select
t = np.arange(-2,2,.01)
f = lambda x: x**3
fx = np.select([(t< -1)*(t>=-2), (t <= 0) * (t>=-1), (t>0) * (t<1),(t>=1) * (t<=2)], [f(t+2),f(-t),f(t),-f(2-t)])
plot(t,fx)
此外,select
允许您通过将默认值传递给参数default
来设置定义间隔之外的默认值。如果你想用你的间隔坚持(-10,10)
范围,你可能需要这样做。