在Numpy中执行集成时的ValueError

时间:2016-12-23 18:47:57

标签: python python-3.x numpy lambda integration

我收到了ValueError我无法解决的问题。我尝试使用integrate.quad函数上的lambda执行简单的集成任务。这是代码:

import numpy as np
p = np.arange(0,1,1/1000)
x = 0
y = 1
z = 0.9
pdfl = lambda p: 2*(p-x)/((y-x)*(z-x)) if p<z else 2*(y-p)/((y-x)*(y-z))
h = lambda pp: integrate.quad(lambda p: p*pdfl(p), 0, pp)

在此代码中,pdfl是(倾斜的)三角形分布的概率密度函数。现在,此函数适用于特定数字,即h(0.5)根据需要为我们提供答案。但是,我想对h中的每个元素进行p评估。但是当我h(p)时,我得到例外:

  File "d:\Anaconda3\lib\site-packages\scipy\integrate\quadpack.py", line 315, in quad
    points)

  File "d:\Anaconda3\lib\site-packages\scipy\integrate\quadpack.py", line 364, in _quad
    if (b != Inf and a != -Inf):

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

有关如何克服此错误的任何建议?谢谢。

1 个答案:

答案 0 :(得分:2)

正如您可以从侧栏问题中看到的那样,此错误是在需要标量为True / False的上下文中使用数组的结果。

我的猜测是quad正在测试边界,pp正在测试inf。当你给它一个边界时它工作正常,例如0.5,但在为其提供一个边界数组p时会产生此错误。 quad旨在一次处理一组边界,而不是数组。

我认为你需要做一些像

这样的事情
res = [h(pp) for pp in p]

即迭代,一次执行一个绑定值的集成。