首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python bisect.bisect() R中的对应物?

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

Stack Overflow用户
提问于 2010-11-06 11:04:35
回答 4查看 607关注 0票数 2

我想从离散分布中抽出。

我有一个矩阵pi,它由概率向量组成(具有相同的列数,每行的和是1)。

在Python中,我可以执行以下操作

代码语言:javascript
复制
cumsumpi = cumsum(pi, axis = 1)
[bisect.bisect(k, random.rand()) for k in cumsumpi]

通过pi给出的概率得到抽签的向量。

现在我想用R重现这一点。我知道R中有“示例”函数,但它似乎使用了一些不同的算法,而不是二等分,所以我得到了不同的绘制,即使我在这两种情况下使用相同的set.seed()。

我使用rpy2在Python语言中获得与在R中完全相同的随机抽奖。

我没有使用random.rand(),而是使用bisect.bisect(k,asarray(robjects.r(‘runif(1)’)来代替cumsumpi中的k

请让我知道,如果有其他函数,而不是样本,在R做同样的事情。

-Joon

编辑:我设法用下面的内容重现了完全相同的图画,但速度很慢。

代码语言:javascript
复制
    cumsumpi = t(apply(pi, 1, cumsum))

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

    apply(cumsumpi, 1, getfirstindx)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-07 00:09:16

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

代码语言:javascript
复制
cumsumpi = t(apply(pi, 1, cumsum));
u = runif(nrow(cumsumpi));

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

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

票数 2
EN

Stack Overflow用户

发布于 2010-11-06 12:36:41

我无法使您的问题标题与问题正文一致--无论如何,这里有一个与python的二等分完全相同的R函数:

gtool*s具有与python的二等分几乎相同的二进制搜索功能**binsearch*,,例如,

代码语言:javascript
复制
# 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
EN

Stack Overflow用户

发布于 2010-11-06 15:34:36

我要找的是findInterval --寻找区间数或指数。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4111685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档