7

我正在尝试为某些数字信号处理构建分段函数,但我无法获得 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()”

剖析函数后,问题似乎是该函数不允许两个条件合二为一,例如: t < -1 and t>-2

但在我看来,允许指定范围对于许多分段函数来说是必不可少的。有没有办法做到这一点?

谢谢!

4

2 回答 2

6

这是因为您不能在 numpy 数组上使用 and 。您需要将andwith*orwith替换+为 numpy 布尔数组。(并且不要忘记添加括号)。

于 2013-09-24T09:56:07.873 回答
4

添加到尼古拉斯的答案的另一个问题是,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)

于 2013-09-24T11:11:02.290 回答