Python错误:具有多个元素的数组的真值是不明确的

时间:2018-04-15 22:32:38

标签: python numpy matplotlib

我知道为什么会出现这种错误。原因很明显。我知道如何用一些低效的代码来避免这个错误(参见问题的最后一点)。但我不知道如何编写有效的实现并避免此错误。

以下是代码:

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

产生这个错误的情节:

Incorrect plot

此图不正确,因为对于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()

但是让原始版本工作会很好,因为它似乎更有效率。

2 个答案:

答案 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表达式。它会返回ab。它不会在abc上按行格式行事。

np.where(c, a, b)
根据{{​​1}}的值,

会返回ab的混合。

c

但请注意,在传递给np.where(x>=0, lambda x,lam=1:lam*exp(-lam*x), 0) 之前,a表达式的所有元素都由Python进行评估。因此,如果您需要跳过where的某些值的评估,请不要使用它(最近有一个问题涉及xpython numpy where returning unexpected warning)。

还有其他方法可以执行此条件分配。但首先要明白为什么你得到这个np.log(x)