【问题标题】:ValueError when defining a lambda function in python在python中定义lambda函数时出现ValueError
【发布时间】:2017-07-09 14:31:34
【问题描述】:

我在使用集成时收到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.

有人可以解释错误并提出另一种集成方式吗?

【问题讨论】:

  • 跳过那里的 lambda 并让 NumPy 完成所有工作?
  • 在python2和python3上运行正常,无法重现。
  • 抱歉,我错了发生错误的那一行。请查看编辑

标签: python-3.x numpy lambda scipy elementwise-operations


【解决方案1】:

最后一行没有给出异常,因为它很好。当您尝试将 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

【讨论】:

  • 谢谢,按照你说的,我查了一下,发现错误确实发生在另一行,请看编辑。您将如何修改集成以使其发挥作用?
【解决方案2】:

你有一堆 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 不同的 xKR 是全局变量,x 是 lambda 的局部变量。

【讨论】:

  • 谢谢您,我现在明白了这个问题,您能否也提出一个解决方案/替代方案?
猜你喜欢
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 2019-06-03
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2013-11-17
相关资源
最近更新 更多