2017-02-28 180 views
3

里面我有一个简单的python 功能蟒蛇迭代过程lambda函数

def positiveGauss(mean,stdev): 
     result = -1 
     while result < 0: 
       result = mean + np.random.randn()*stdev 
     return result 

是否有可能做使用拉姆达同样的伎俩?它需要在lambda内进行迭代,但我仍然相信这是可能的。

+1

AFAIK,不,这不可能与lambda –

+0

你完全想摆脱'while'吗?因为有一个统计方法来做到这一点。与逆归一化函数有关。您从区间[0,_t_](其中0 <_t_ <1)选择一个(随机)实数。然后将逆规范化函数应用于_t_。不要忘记缩放您的参数“mean”和“stdev”。 – Elmex80s

+0

@ Elmex80s我需要截断正态分布。分配必须是正态分布。这是我的旧统计课本的想法,也许不是最好的。 – rth

回答

5

对于多样性的缘故:

lambda m, s: next(x for x in (m + np.random.randn() * s for _ in iter(int, 1)) if x >= 0) 

非递归的解决方案,利用了iter和两个发生器表达式两个参数的形式的。

iter(int, 1)调用int()直到它返回1,这根本不会发生。因此,内发电机表达

(m + np.random.randn() * s for _ in iter(int, 1)) 

是评价和产量m + np.random.randn() * s无限期的发电机。外部生成器表达式逐个从内部表达式获取值,但仅生成等于或大于零的值。然后next函数接收来自外部发生器的第一个值,这是内部发生器匹配条件产生的第一个值。

+0

它似乎有效,但为什么?!你能否更好地解释整个建筑? – rth

+0

@rth:我加了解释 – vaultah

+0

嗯,我也喜欢。真的不知道哪个是更好的解决方案,你的还是@ hashcode55。两者都有道理。谢谢。 – rth

4
positive_gauss = lambda mean, stddev, result = -1: positive_gauss(mean, stddev, mean + np.random.randn()*stddev) if result < 0 else result 

这是一个递归函数。我要打破它 -

lambda mean, stddev, result = -1: # takes 3 parameters 
    positive_gauss(mean, stddev, mean + np.random.randn()*stddev) if result < 0 
    #^Your first condition, if its true call the same function modifying result 
    else result # if the above one fails just return result. 

是的,正如@ juanpa.arrivillaga这不应该被使用,因为它失去的匿名函数本质。

+0

不错,但你应该指出*一个人不会使用这个*。实际上,既然你已经命名了你的lambda,它并不是真正符合lambda函数的精神。 –

+0

@ hashcode55这真的很酷!谢谢!我不知道lambda可以递归。 – rth

+0

@rth是的,他们确实可以。 Lambda函数受到函数式编程的启发,只有递归。没有循环。 – hashcode55