Hm. Is this a reasonable implementation of a laplace mixture? The try/except seems to be an ugly way of dealing with the fact that int/float don't return a length, but it gets around testing for what they are...
I'm still curious if there is a way of avoiding the for loop via numpy magic, but this is not a performance bottleneck so...
import numpy as np
def laplace_mix(loc, scale, size, pvals = None):
try:
dim = len(loc)
if dim != len(scale):
raise NameError("Different number of location and scale parameters.")
except:
dim = 1
loc = [loc]
scale = [scale]
if pvals is None:
pvals = [ 1/dim for i in range(dim) ]
args = zip(loc, scale)
indicate = np.random.multinomial(n=1, pvals=pvals, size=size)
where = np.where(indicate == 1)[1]
out = np.zeros(size)
for i in range(size):
out[i] = np.random.laplace( loc = loc[where[i]], scale = scale[where[i]], size = 1 )
return(out)
I'm still curious if there is a way of avoiding the for loop via numpy magic, but this is not a performance bottleneck so...
No comments:
Post a Comment