我知道为什么会出现这种错误。原因很明显。我知道如何用一些低效的代码来避免这个错误(参见问题的最后一点)。但我不知道如何编写有效的实现并避免此错误。
以下是代码:
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值应为零。这是代码的目的&#34;如果x> = 0,则为0&#34;。
当然,我可以更改图形功能的实现,以使其工作:
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()
但是让原始版本工作会很好,因为它似乎更有效率。
答案 0 :(得分:1)
将表达式乘以(x>=0)
pdf_exp = lambda x,lam=1: lam*exp(-lam*x)*(x>=0)
这是有效的,因为布尔数组在算术运算的上下文中只被解释为1和0。 E.g。
x = np.array([-1,2,3,-3])
print(x>=0) # [False True True False]
print(x*(x>=0)) # [0 2 3 0]
答案 1 :(得分:0)
在标量上下文(例如if
语句)中使用布尔数组时会产生此错误:
lambda x,lam=1:lam*exp(-lam*x) if x>=0 else 0
仅当x
是标量或单个元素数组时才有效。如果x
是一个包含多个元素的数组,则x>=0
是一个具有相同元素数的布尔值。 自行验证
a if c else b
是一个标量Python表达式。它会返回a
或b
。它不会在a
,b
和c
上按行格式行事。
np.where(c, a, b)
根据{{1}}的值,会返回a
和b
的混合。
c
但请注意,在传递给np.where(x>=0, lambda x,lam=1:lam*exp(-lam*x), 0)
之前,a
表达式的所有元素都由Python进行评估。因此,如果您需要跳过where
的某些值的评估,请不要使用它(最近有一个问题涉及x
,python numpy where returning unexpected warning)。
还有其他方法可以执行此条件分配。但首先要明白为什么你得到这个np.log(x)
。