if y>0.0 and x -y>=-Q1: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

血红的双手。 提交于 2019-12-13 06:51:19

问题


I have been trying to get this to work for a while now, but still not finding a way. I am trying to compute the Look ahead estimate density of a piecewise gaussian function. I'm trying to estimate the stationary distribution of a piecewise normally distributed function. is there a way to avoid the error type:

Error-type: the truth value of an array with more than one element is ambiguous. Use a.any() or a.all(). 

for instance y=np.linspace(-200.0,200.0,100) and x = np,linspace(-200.0,200.0,100). then verify the condition as stated in the code below?

import numpy as np
import sympy as sp
from numpy import exp,sqrt,pi
from sympy import Integral, log, exp, sqrt, pi
import math
import matplotlib.pyplot as plt 
import scipy.integrate
from scipy.special import erf
from scipy.stats import norm, gaussian_kde
from quantecon import LAE
from sympy.abc import q
#from sympy import symbols
#var('q')
#q= symbols('q')

## == Define parameters == #
mu=80
sigma=20
b=0.2
Q=80
Q1=Q*(1-b)
Q2=Q*(1+b)
d = (sigma*np.sqrt(2*np.pi))
phi = norm()
n = 500

#Phi(z) = 1/2[1 + erf(z/sqrt(2))].

def p(x, y):
   # x, y = np.array(x, dtype=float), np.array(y, dtype=float)
    Positive_RG = norm.pdf(x-y+Q1, mu, sigma)
    print('Positive_R = ', Positive_RG)
    Negative_RG = norm.pdf(x-y+Q2, mu, sigma) 
    print('Negative_RG = ', Negative_RG)
    pdf_0= (1/(2*math.sqrt(2*math.pi)))*(erf((x+Q2-mu)/(sigma*np.sqrt(2)))-erf((x+Q1-mu)/(sigma*np.sqrt(2))))
    Zero_RG =norm.pdf
    print('Zero_RG',Zero_RG)
    print ('y',y)
    if y>0.0 and x -y>=-Q1:
        #print('printA', Positive_RG)
        return Positive_RG
    elif y<0.0 and x -y>=-Q2:
        #print('printC', Negative_RG)
        return Negative_RG
    elif y==0.0 and x >=-Q1:
        #print('printB', Zero_RG)
        return Zero_RG
    return 0.0 


Z = phi.rvs(n)
X = np.empty(n)
for t in range(n-1):
    X[t+1] = X[t] + Z[t]
    #X[t+1] = np.abs(X[t]) + Z[t]
psi_est = LAE(p, X)
k_est = gaussian_kde(X)

fig, ax = plt.subplots(figsize=(10,7))
ys = np.linspace(-200.0, 200.0, 200)
ax.plot(ys, psi_est(ys), 'g-', lw=2, alpha=0.6, label='look ahead estimate')
ax.plot(ys, k_est(ys), 'k-', lw=2, alpha=0.6, label='kernel based estimate')
ax.legend(loc='upper left')
plt.show()

回答1:


Error starts with quantecon.LAE(p, X), which expects a vectorized function p. Your function isn't vectorized, which is why everything else doesn't work. You copied some vectorized code, but left a lot of things as sympy style functions which is why the numpy folks were confused about what you wanted.

In this case "vectorized" means transforming two 1D arrays with length n into a 2D n x n array. In this case, you don't want to return 0.0, you want to return out a 2d ndArray which has the value 0.0 in locations out[i,j] where a boolean mask based on a function of x[i], y[j] is false.

You can do this by broadcasting:

def sum_function(x,y):
    return x[:, None] + y[None, :]   # or however you want to add them, broadcasted to 2D

def myFilter(x,y):
    x, y = x.squeeze(), y.squeeze()
    out=np.zeros((x.size,y.size))
    xyDiff = x[:, None] - y[None, :]
    out=np.where(np.bitwise_and(y[None, :] => 0.0, xyDiff >= -Q1), sum_function(x, y), out) # unless the sum functions are different
    out=np.where(np.bitwise_and(y[None, :] < 0.0, xyDiff >= -Q2), sum_function(x, y), out)
    return out



回答2:


See all those ValueError questions in the side bar????

This error is produced when a boolean array is used in a scalar boolean context, such as if or or/and.

Try your y or x in this test, or even simpler one. Experiment in a interactive shell.

if y>0.0 and x -y>=-Q1: ....

if y>0: 

(y>0.0) and (x-y>=10)

will all produce this error with your x and y.

Notice also that I edited your question for clarity.



来源:https://stackoverflow.com/questions/42545861/if-y0-0-and-x-y-q1-valueerror-the-truth-value-of-an-array-with-more-than-o

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!