2014-07-07 27 views
1

這是用幾何分佈生成隨機數的最佳方式或最有效的方法,其中可能包含0的參數數組?Python:從幾何分佈生成

allids["c"]=[2,0,1,1,3,0,0,2,0] 
[ 0 if x == 0 else numpy.random.geometric(1./x) for x in allids["c"]] 

注意我有點擔心優化。

編輯:

上下文的一點:我有個字符(即ATCGGGA)的順序,我想擴大單個字符/合同到期(即如果原來的序列有2運行「A的我想模擬一個預期值爲2'A的序列,但是根據幾何分佈而變化)。所有長度爲1的字符我都不想變長。

所以,如果

seq = 'AATCGGGAA' 
allids["c"]=[2,0,1,1,3,0,0,2,0] 
rep=[ 0 if x == 0 else numpy.random.geometric(1./x) for x in allids["c"]] 

"".join([s*r for r, s in zip(rep, seq)]) 

將輸出(當rep[1, 0, 1, 1, 3, 0, 0, 1, 0]

"ATCGGGA" 
+1

有用於幾何分佈兩個數學定義,第一個(它是由Python實現)有嚴格的正整數支持1,2,3,...表示直到第一次成功爲止的試驗次數,第二次在0,1,2,...上得到支持,代表直到第一次成功爲止的失敗次數。你能給我們一些關於數組真實代表的用法上下文嗎?如果他們應該是手段,0是先驗無效的。如果它們是實現結果,則應該使用第二個幾何形式,但需要更多數據來估計參數化。 – pjs

+0

我知道幾何分佈的不同參數。如果您仍然感興趣,我添加了一些背景。 – bdeonovic

回答

2

您可以使用masked array來避免被零除。

import numpy as np 
a = np.ma.masked_equal([2, 0, 1, 1, 3, 0, 0, 2, 0], 0) 
rep = np.random.geometric(1./a) 
rep[a.mask] = 0 

這生成的a每個元素的隨機樣本,然後刪除它們中的一些後來。如果你很在意這種浪費的隨機數,可以生成剛好夠,就像這樣:

import numpy as np 
a = np.ma.masked_equal([2, 0, 1, 1, 3, 0, 0, 2, 0], 0) 
rep = np.zeros(a.shape, dtype=int) 
rep[~a.mask] = np.random.geometric(1./a[~a.mask]) 
+0

哦,更清潔 – daniel

+0

偉大的解決方案傢伙,我知道我不是單獨繪製隨機數的效率。 – bdeonovic

1

這個怎麼樣:

counts = array([2, 0, 1, 1, 3, 0, 0, 2, 0], dtype=float) 
counts_ma = numpy.ma.array(counts, mask=(counts == 0)) 
counts[logical_not(counts.mask)] = \ 
    array([numpy.random.geometric(v) for v in 1.0/counts[logical_not(counts.mask)]]) 

你可能預先計算均聚物運行和限制的分佈撥打的電話數量作爲從RNG獲取大量值比個別調用更有效