Python 3.x 在python中定义lambda函数时发生ValueError

Python 3.x 在python中定义lambda函数时发生ValueError,python-3.x,numpy,lambda,scipy,elementwise-operations,Python 3.x,Numpy,Lambda,Scipy,Elementwise Operations,使用集成时,我收到一个ValueError,但我无法理解原因。以下是我的简化代码: import numpy as np import scipy.integrate as integrate pbar = 1 p = np.arange(0,pbar,pbar/1000) h = lambda p: p**2/2+p*(1-p) Kl = lambda p: h(p) +0.02 K = Kl(p) R = 0.5*h(p) + 0.5*h(pbar) Vl = lambda p: np.mi

使用集成时,我收到一个
ValueError
,但我无法理解原因。以下是我的简化代码:

import numpy as np
import scipy.integrate as integrate
pbar = 1
p = np.arange(0,pbar,pbar/1000)
h = lambda p: p**2/2+p*(1-p)
Kl = lambda p: h(p) +0.02
K = Kl(p)
R = 0.5*h(p) + 0.5*h(pbar)
Vl = lambda p: np.minimum.reduce([p, K, R])
integrate.quad(Vl, 0, pbar)[0]
Vl
是三个阵列的元素最小值。最后一行给出了例外情况:

ValueError: setting an array element with a sequence.

有人能解释一下错误并提出一种进行集成的替代方法吗?

最后一行没有给出异常,因为它很好。当您尝试将Vl与整数或浮点而不是数组一起使用时,将出现异常。以下代码按预期运行

x = np.random.randn(K.shape)
res = Vl(x)
用你的代码。如果您想用一个数字来比较两个数组,只需创建一个以该数字作为条目的数组,即

five_array = 5*np.ones(K.shape)
res = Vl(five_array)
对编辑的答复: 这是一个非常奇怪的集成,但是如果这是你想要的,我会使用集成的定义来实现它,即

x_int = np.linspace(0,pbar,len(K))
integral = Vl(x_int).mean()*pbar

您有一组1000个元素数组:

In [8]: p.shape
Out[8]: (1000,)
In [9]: K.shape
Out[9]: (1000,)
In [10]: R.shape
Out[10]: (1000,)
In [11]: np.minimum.reduce([p, K, R]).shape
Out[11]: (1000,)
In [12]: Vl(p).shape
Out[12]: (1000,)
In [8]: p.shape
Out[8]: (1000,)
In [9]: K.shape
Out[9]: (1000,)
In [10]: R.shape
Out[10]: (1000,)
In [11]: np.minimum.reduce([p, K, R]).shape
Out[11]: (1000,)
In [12]: Vl(p).shape
Out[12]: (1000,)
但是
integrate.quad
正在使用标量调用
Vl
,标量是一个从0到
pbar的积分变量。积分的本质是在一组点上计算
Vl
,并适当地求和这些值

Vl(0)
产生此错误,因为它是

In [15]: np.minimum.reduce([0, K, R])    
ValueError: setting an array element with a sequence.
因此,您需要更改
Vl
以使用标量
p
,或者直接在数组上执行求和

书写

Vl = lambda x: np.minimum.reduce([x, K, R])

可能是你造成的
Vl
与与全局
p
不同的
x
不起作用
K
R
是全局变量,
x
是lambda的本地变量。

跳过lambda,让NumPy完成所有工作?在python2和python3上运行得很好,无法复制。很抱歉,错误发生的那一行我错了。请看编辑谢谢,按照你说的,我检查发现错误确实发生在另一行,请看编辑。您将如何修改集成以使其生效?非常感谢,我现在了解了问题,您能否提出解决方案/备选方案?