【问题标题】:Wrapping function to use different paremetres in python包装函数以在 python 中使用不同的参数
【发布时间】:2017-02-12 11:27:06
【问题描述】:

我想用scipy.stats.gamma.rvs生成伽马分布随机变量

但是,API 接受形状和比例参数作为输入,我想使用均值和标准差作为输入。

我可以编写一个包装器,它将均值和标准值作为输入,计算比例和形状,然后使用 gamma.rvs 生成随机变量。但是我希望这个函数会被多次调用,所以如果我不必每次都进行计算,我会更喜欢。

我想出了以下解决方案:

from scipy.stats import gamma


def gamma_rvs_generator(mu, sigma):
    var = sigma ** 2
    scale = var / mu
    a = mu / scale
    return lambda: gamma.rvs(a=a, scale=scale)


if __name__ == '__main__':
    gen = gamma_rvs_generator(10, 10)
    print(gen())

这完全符合我的要求。但我想问一下,是否有更好/更 Pythonic 的解决方案。

【问题讨论】:

  • 另一种方法是编辑 API,但事实并非如此。顺便问一下,你为什么用lambda
  • @magicleon 这使它成为一个带有0 参数的函数,可以重复调用,每次产生不同的随机数。如果没有lambda,它将返回一个随机数,因此需要使用每个新的随机数重新运行包装器。
  • 哦,像构造函数?不错!

标签: python random scipy


【解决方案1】:

我觉得 - 但这是一个品味问题 - 利用 rv_frozen 对象会更加 Pythonic:

from scipy.stats import gamma


def gamma_alt(mu, sigma):
    var = sigma ** 2
    scale = var / mu
    a = mu / scale
    return gamma(a=a, scale=scale)


if __name__ == '__main__':
    gen = gamma_alt(10, 10)
    print(gen.rvs())

注意对gamma 本身的调用,而不是gamma.rvs。优势:您的 gamma_alt 表现得更像一个“正常”的 scipy stats 公民。例如,您不仅会获得rvs,还会自动获得pfdcfd 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多