def my_betapdf(x,a,b):
''' this implements the betapdf with less input checks '''
if type(x) is int or float:
x = array(x)
# Initialize y to zero.
y = zeros(shape(x))
if len(ravel(a)) == 1:
a = tile(a,shape(x))
if len(ravel(b)) == 1:
b = tile(b,shape(x))
# Special cases
y[logical_and(a==1, x==0)] = b[logical_and(a==1 , x==0)]
y[logical_and(b==1 , x==1)] = a[logical_and(b==1 , x==1)]
y[logical_and(a<1 , x==0)] = inf
y[logical_and(b<1 , x==1)] = inf
# Return NaN for out of range parameters.
y[a<=0] = nan
y[b<=0] = nan
y[logical_or(logical_or(isnan(a), isnan(b)), isnan(x))] = nan
# Normal values
k = logical_and(logical_and(a>0, b>0),logical_and(x>0 , x<1))
a = a[k]
b = b[k]
x = x[k]
# Compute logs
smallx = x<0.1
loga = (a-1)*log(x)
logb = zeros(shape(x))
logb[smallx] = (b[smallx]-1) * log1p(-x[smallx])
logb[~smallx] = (b[~smallx]-1) * log(1-x[~smallx])
y[k] = exp(loga+logb - betaln(a,b))
return y
评论列表
文章目录