【问题标题】:Vectorizing numpy.random.multinomial矢量化 numpy.random.multinomial
【发布时间】:2016-08-25 10:42:25
【问题描述】:

我正在尝试对以下代码进行矢量化:

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 是一个二维矩阵,其中包含对的概率。 多项式期望从s矩阵的每一行中抽取一个随机样本,并将结果存储在向量a中。

【问题讨论】:

标签: python numpy vectorization random-sample


【解决方案1】:

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

问题的目标是获得包含多项事件的1的位置的索引。也就是说,下面的实现[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]会产生14。因此,它实际上等价于执行:

np.random_choice(np.arange(len(p)),p=p) # here, p is s[i,:]

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

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 倍:

%%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】:

    怎么样

    [np.argmax(np.random.multinomial(1,s[i,:])) for i in xrange(s.shape[0])]
    

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 2013-05-28
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多