Valueerror When Defining A Lambda Function In Python
Solution 1:
You have a bunch of 1000 element arrays:
In[8]: p.shapeOut[8]: (1000,)
In[9]: K.shapeOut[9]: (1000,)
In[10]: R.shapeOut[10]: (1000,)
In[11]: np.minimum.reduce([p, K, R]).shapeOut[11]: (1000,)
In[12]: Vl(p).shapeOut[12]: (1000,)
In[8]: p.shapeOut[8]: (1000,)
In[9]: K.shapeOut[9]: (1000,)
In[10]: R.shapeOut[10]: (1000,)
In[11]: np.minimum.reduce([p, K, R]).shapeOut[11]: (1000,)
In[12]: Vl(p).shapeOut[12]: (1000,)
But integrate.quad
is calling Vl
with a scalar, an integration variable rangine from 0 to pbar
. The nature of the integration is to evaluate Vl
at a bunch of points, and sum the values appropriately.
Vl(0)
produces this error because it is
In [15]: np.minimum.reduce([0, K, R])
ValueError: setting an array element with a sequence.
So you need to change Vl
to work with a scalar p
, or perform your sum directly on the array.
Writing
Vl = lambda x: np.minimum.reduce([x, K, R])
might have clued you into the difference. Vl
does not work with x
different from the global p
. K
and R
are globals, x
is local to the lambda.
Solution 2:
The last line doesn't give the exception because it is fine. You will get the exception, when you try to use Vl with an integer or float instead of an array. The following code runs as expected
x = np.random.randn(K.shape)
res = Vl(x)
with your code. If you want to compare the two arrays with a single number just create an array with only this number as entry, i.e.
five_array = 5*np.ones(K.shape)
res = Vl(five_array)
Answer to the edit: This is a quite strange integration, but if that is what you want I would do it by using the definition of integration, i.e.
x_int = np.linspace(0,pbar,len(K))
integral = Vl(x_int).mean()*pbar
Post a Comment for "Valueerror When Defining A Lambda Function In Python"