2017-02-12 18 views
2

我想與scipy.stats.gamma.rvs包裝功能來使用不同的paremetres在python

以產生伽馬分佈的隨機變量然而,API接受的形狀和尺度參數作爲輸入,並予想使用平均值和標準偏差作爲輸入。

我可以寫一個包裝,它將得到平均值和std作爲輸入,計算比例和形狀,並比使用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解決方案。

+0

另一種方法是編輯API,但好,這是情況並非如此。順便說一下,你爲什麼使用'lambda'? – magicleon

+1

@magicleon這使得它可以重複調用'0'參數,每次生成一個不同的隨機數。如果沒有'lambda',它會返回一個隨機數,因此需要用每個新的隨機數重新運行包裝器。 –

+0

哦,像一個構造函數?太好了! – magicleon

回答

3

我覺得 - 但是這是一個品味的問題 - 這將是更Python採取rv_frozen對象的優勢:

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數據公民。例如,你得到的不僅僅是rvs而且還自動pfdcfd