【问题标题】:Numpy random number generators and lambda functions [duplicate]Numpy随机数生成器和lambda函数[重复]
【发布时间】:2021-03-01 21:26:11
【问题描述】:

我正在尝试创建一个随机变量列表wtfuns,我可以将其称为:wtfuns[i](size=1000),以返回特定随机变量的 1000 个样本的列表。为此,我使用如下 lambda 函数:

wtfuns = []
pvals = [0.3,0.5,0.7]
for p in pvals:
    wtfuns.append(('bernoulli p='+str(p),lambda **x: binom(p,**x)))

for i in range(3):
    print(wtfuns[i][1](size=1000).mean())

输出

0.686
0.684
0.706

也就是说,在wtfuns[:,1] 列中,我有相同的二项式随机变量,参数为 0.7。然而,

for p in pvals:
    print(wtfuns[0][1](size=1000).mean())

生产

0.311
0.524
0.67

不知何故,p 值通过引用传递给 lambda 函数。到底是怎么回事?我完全糊涂了。

【问题讨论】:

  • wtfuns.append(('bernoulli p='+str(p), lambda p=p, **x: binom(p,**x)))

标签: python numpy random


【解决方案1】:

是的,您的第一个定义捕获了对p 的引用。随着p 的变化,函数也会发生变化。解决方案是使用将 lambda 转换为闭包的技巧:

    wtfuns.append(('bernoulli p='+str(p),lambda p=p,**x: binom(p,**x)))

“p=p”这个东西将p的当前值捕获到一个本地,它带有函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2019-04-25
    • 2018-06-25
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多