Python lambda函数中的迭代过程

3

我有一个简单的Python函数

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

使用lambda能否做到同样的技巧?它需要在lambda内部进行迭代,但我仍然相信这是可能的。


1
据我所知,不,使用lambda是不可能的。 - Code-Apprentice
你是否绝对想要摆脱 while 循环?因为有一种统计方法可以做到这一点。它与反归一化函数有关。你可以从区间 [0, t](其中 0 < t < 1)中选择一个(随机的)实数。然后将反归一化函数应用于 _t_。不要忘记根据你的参数 meanstdev 进行缩放。 - Elmex80s
@Elmex80s 我需要截断正态分布。分布必须是正态分布。这是我旧的统计教材中的想法,可能不是最好的。 - rth
2个回答

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 函数从外部生成器中获取第一个满足条件的内部生成器产生的值。


它似乎可以工作,但为什么?你能否更好地解释整个结构? - rth
@rth:我添加了解释。 - vaultah
嗯,我也喜欢。真的不知道哪个方案更好,你的还是@hashcode55的。两者都有道理。谢谢。 - rth
1
@vaultah 我一定会在高尔夫比赛中使用这个!哈哈 - hashcode55

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所说,这不应该被使用,因为它失去了匿名函数的本质。


不错,但你可能应该指出永远不会使用这个。实际上,由于你已经命名了lambda函数,它并不符合lambda函数的精神。 - juanpa.arrivillaga
@hashcode55 真的很酷!谢谢你!我不知道 lambda 可以递归。 - rth
@rth 是的,它们确实可以。Lambda函数受到函数式编程的启发,其中只有递归,没有循环。 - hashcode55
经过非常仔细的思考,我决定@vaultah的解决方案更好。如果均值为负数并且我们正在寻找正态分布的一小部分,则不会溢出堆栈或内存。 - rth
@rth 是的,在Python中使用递归会遇到这个问题(没有尾调用优化)。我也喜欢vaultah的解决方案! - hashcode55

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接