2017-02-20 52 views
-2

我在使用集成時收到ValueError,但我不明白爲什麼。這裏是我的簡化代碼:在python中定義lambda函數時的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. 

可有人請解釋錯誤,並提出做這個整合的另一種方式?

+0

只需跳過lambda,讓NumPy完成所有工作? – Divakar

+1

在python2和python3上運行得很好,無法重現。 –

+0

我很抱歉,我錯誤的發生錯誤。請參閱編輯 – splinter

回答

1

你有一堆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使用標量,從0到pbar的積分變量rangine調用Vl。整合的本質是在一堆點上評估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不適用於x與全球p不同。 KR是全局變量,x是lambda本地的。

+0

謝謝你,我現在明白了這個問題,你能否也請提出一個解決方案/替代方案? – splinter

1

最後一行沒有給出例外,因爲它沒有問題。當你嘗試用整數或浮點數來代替數組時,你會得到異常。以下代碼按預期方式運行:

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 
+0

謝謝,按照您的說法,我檢查並發現錯誤確實發生在另一行,請參閱編輯。你將如何修改整合,以便解決問題? – splinter