我知道为什么会出现这个错误。原因有据可查。而且我知道如何使用一些低效的代码来避免这个错误(请参阅问题的最后一点)。但我不知道如何编写有效的实现并避免此错误。
这是代码:
pdf_exp=lambda x,lam=1:lam*exp(-lam*x) if x>=0 else 0
def graph(funct, x_range):
x=np.array(x_range)
y=funct(x)
plt.plot(x,y,'r--')
plt.show()
graph(lambda x: pdf_exp(x), np.linspace(-10,10,10000))
当我运行这个时,我收到错误:
----> 3 y=funct(x)
----> 1 graph(lambda x: pdf_exp(x), np.linspace(0,10,10000))
----> 1 pdf_exp=lambda x,lam=1:lam*exp(-lam*x) if x>=0 else 0
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()
当我做出改变时
pdf_exp=lambda x,lam=1:lam*exp(-lam*x)
然后这运行没有错误,但情节不正确。但我真的需要在那里包含那一点代码。
如果我进行错误消息建议的更改,我会收到另一条错误消息或不正确的绘图。这个变化:
pdf_exp=lambda x,lam=1:lam*exp(-lam*x) if (x>=0).all() else 0
产生这个错误:
x and y must have same first dimension, but have shapes (10000,) and (1,)
这些变化中的任何一个
pdf_exp=lambda x,lam=1:lam*exp(-lam*x) if (x>=0).any() else 0
pdf_exp=lambda x,lam=1:lam*exp(-lam*x) if x.any()>=0 else 0
产生这个不正确的情节:
此图不正确,因为 x<0 时 y 值应为零。这就是代码“if x>=0 else 0”的目的。
当然,我可以更改图形函数的实现以使其正常工作:
def graph(funct, x_range):
y_range=[]
for x in x_range:
y_range.append(funct(x))
plt.plot(x_range,y_range,'r--')
plt.show()
但是让原始版本工作会很好,因为它似乎更有效。
只需将你的表达式乘以 (x>=0)
pdf_exp = lambda x,lam=1: lam*exp(-lam*x)*(x>=0)
这是有效的,因为布尔数组在算术运算的上下文中仅被解释为 1 和 0。例如
x = np.array([-1,2,3,-3])
print(x>=0) # [False True True False]
print(x*(x>=0)) # [0 2 3 0]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句