R中的Python bisect.bisect()对应?

时间:2010-11-06 03:04:35

标签: python 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 cums in cumsumpi]

如果R中的样品还有其他功能,请告诉我相同的事情。

-Joon

编辑: 我设法使用以下内容重现完全相同的绘制,但速度很慢。

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

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

    apply(cumsumpi, 1, getfirstindx)

4 个答案:

答案 0 :(得分:2)

这是一种替代方法,它避免使用apply而是对操作进行矢量化。初步检查表明它的速度是原来的两倍,但需要详细探讨。

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

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

为了进一步加快速度,可以考虑对计算每行累积列总和的操作进行矢量化。通过在R代码上运行探查器,让我知道该步骤是否是瓶颈。

答案 1 :(得分:0)

我无法将你的问题的标题与问题主体调和 - 无论如何,这里的R函数与python的bisect相同:

gtool * 有一个二进制搜索功能,* * binsearch * ,几乎与python的bisect相同,例如,

# 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

答案 2 :(得分:0)

我在寻找的是findInterval - 查找间隔号或指数。 :)

答案 3 :(得分:0)

我没有发布,但我最终使用的非常相似:

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

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

速度与您的代码几乎相同。如果我知道max.col,我会用它。

根据你的建议,我对cumsum事物进行了矢量化,它给了我非凡的速度提升。谢谢。

-Joon