首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向量化numpy.random.multinomial

向量化numpy.random.multinomial
EN

Stack Overflow用户
提问于 2016-04-30 16:02:14
回答 2查看 1.5K关注 0票数 9

我正在尝试向量化以下代码:

代码语言:javascript
运行
复制
for i in xrange(s.shape[0]):
            a[i] = np.argmax(np.random.multinomial(1,s[i,:]))

给出了s.shape = 400 x 100

应为a.shape = 400

S是一个2D矩阵,它包含成对的概率。多项式期望从s矩阵的每一行中随机抽取样本,并将结果存储在向量a中。

EN

回答 2

Stack Overflow用户

发布于 2018-05-11 18:57:30

comments中,据说有人试图对这个here进行矢量化,然而,这不仅仅是一次尝试。这也是这个问题的一个完整的解决方案。

这个问题的目的是获得包含多项式事件的1的位置的指数。也就是说,下面的实现[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]将产生14。因此,它实际上等同于执行:

代码语言:javascript
运行
复制
np.random_choice(np.arange(len(p)),p=p) # here, p is s[i,:]

因此,在随机矩阵的所有行上进行快速随机加权选择的Warren Weckesser solution也是这个问题的解决方案。唯一的区别是概率向量是在行中定义还是在列中定义,这可以很容易地解决,既可以将s转置用作prob_matrix,也可以定义用于s结构的自定义版本的vectorized

代码语言:javascript
运行
复制
def vectorized(prob_matrix, items):
    s = prob_matrix.cumsum(axis=1)
    r = np.random.rand(prob_matrix.shape[0])
    k = (s < r).sum(axis=1)
    return items[k]

在这个问题中,尺寸为400x400,加速比约为10倍:

代码语言:javascript
运行
复制
%%timeit
a = np.empty(400)
for i in range(s.shape[0]):
    a[i] = np.argmax(np.random.multinomial(1,s[i,:]))
# 5.96 ms ± 46.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit 
vals = np.arange(400,dtype=int)
vectorized(s,vals)
# 544 µs ± 5.49 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
票数 2
EN

Stack Overflow用户

发布于 2017-05-04 06:04:24

怎么样

代码语言:javascript
运行
复制
[np.argmax(np.random.multinomial(1,s[i,:])) for i in xrange(s.shape[0])]
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36952419

复制
相关文章

相似问题

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