如何在numpy.piecewise中指定范围(每个范围有2个条件)

8

我正在尝试构建一段分段函数来进行数字信号处理,但是我无法让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

但我认为允许指定范围对于许多分段函数至关重要。有没有办法做到这一点?

谢谢!

2个回答

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

1
虽然结果相同,但使用位运算符“&”和“|”可能是更好的实践。 - Jaime
是的,那就是问题所在。谢谢!我也同意Jamie的看法,按位运算符可能是最好的选择。 - Pswiss87

4

除了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) 内保持间隔,则可能需要这样做。

好的观点 -> 在这种情况下,选择会是我首选的函数。我运行了代码,它绘制出了我希望的图形。谢谢! - Pswiss87

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接