【问题标题】:python iterative process inside lambda functionlambda函数内的python迭代过程
【发布时间】:2017-02-28 21:21:47
【问题描述】:

我有一个简单的python 函数

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

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

【问题讨论】:

  • AFAIK,不,这在 lambda 中是不可能的
  • 你真的想摆脱while吗?因为有一种统计方法可以做到这一点。与反归一化函数有关。您从区间 [0, t] (其中 0 t t。不要忘记缩放您的参数meanstdev
  • @Elmex80s 我需要截断的正态分布。分布必须是正态分布。这是我旧的统计教科书中的想法,也许不是最好的。

标签: python loops lambda


【解决方案1】:

为了多样性:

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:我添加了解释
  • 嗯,我也喜欢。真的不知道哪个是更好的解决方案,你的还是@hashcode55。两者都有道理。谢谢。
  • @vaultah 我会在打高尔夫球时使用它!哈哈
【解决方案2】:
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 函数的精神。
  • @hashcode55 真的很酷!谢谢!我不知道 lambda 可以递归。
  • @rth 确实可以。 Lambda 函数的灵感来自只有递归的函数式编程。没有循环。
  • 经过深思熟虑后,我认为@vaultah 解决方案要好得多。如果平均值为负数,则不是堆栈或内存溢出,我们正在寻找正态分布的一小部分。
  • @rth 是的,递归在 python 中会遇到这个问题(没有 TCO)。我也喜欢 vaultah 的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 2020-11-20
  • 2022-11-03
  • 2017-01-17
相关资源
最近更新 更多