2010-11-06 41 views
1

我想從離散分佈中繪製。Python中的bisect.bisect()對應於R?

我有一個矩陣pi,它由概率向量(具有相同數量的列,並且每行的總和爲1)組成。

在Python,我可以做以下

cumsumpi = cumsum(pi, axis = 1) 
[bisect.bisect(k, random.rand()) for k in cumsumpi] 

獲得由PI給出的概率繪製的向量。

現在我想用R重現這一點。我知道R中有「sample」函數,但它似乎使用了一些不同的算法,然後平分,因此我得到不同的繪圖,即使我使用相同的set.seed( )在這兩種情況下。

我用rpy2得到在Python完全相同的隨機繪製如R.例如,

代替random.rand()中,我使用 [bisect.bisect(K,asarray(robjects.r ('runif(1)')))for k in cumsumpi]

請讓我知道是否有其他功能比樣品在R做同樣的事情。

-Joon

編輯: 我設法再現與下面完全相同的平局,但它是緩慢的。

cumsumpi = t(apply(pi, 1, cumsum)) 

    getfirstindx = function(cumprobs) { 
     return(which(cumprobs > runif(1))[1]) 
    } 

    apply(cumsumpi, 1, getfirstindx) 

回答

1

這裏是避免使用apply的替代方法,而是將操作向量化。初步檢查表明它快兩倍,但需要更詳細地探討。

cumsumpi = t(apply(pi, 1, cumsum)); 
u = runif(nrow(cumsumpi)); 

max.col((cumsumpi > u) * 1, "first") 

進一步加快步伐,人們會想到向量化,計算各行累計列總和的操作。通過在您的R代碼上運行探查器,讓我知道這一步是否是瓶頸。

0

我無法調和你的問題與問題的體標題 - 在任何情況下,這裏的R功能等同於Python的開張:

gtool * S有一個二進制搜索功能* * BINSEARCH *,這幾乎等同於Python的對開,例如

# search for 25 in the range 0 through 100 
> binseaerch(fun = function(x) x - 25, range=c(0, 100)) 

$call 
binsearch(fun = function(x) x - 25, range = c(0, 100)) 

$numiter 
[1] 2 

$flag 
[1] "Found" 

$where 
[1] 25 

$value 
[1] 0 
+0

我可能是錯的,但我不認爲這就是我要找的。我想要的是獲得runif(1)所在的向量的索引(由累積概率組成,例如[0.1,0.3,0.7,1])。例如,如果runif(1)draw爲0.5,則平分爲3,這是0.7的指數。 (0.3 joon 2010-11-06 07:00:13

0

我一直在尋找的是findInterval - 尋找區間數或指數。 :)

0

我沒有將它張貼,但我最終使用是非常相似:

cumsumpi = t(apply(pi, 1, cumsum)) 

1 + rowSums(cumsumpi > runif(nrow(pi))) 

的速度幾乎相同的代碼。如果我知道max.col,我會使用它。

並遵循你的建議,我矢量化cumsum的東西,它給了我平平的速度增加。謝謝。

-Jun