我正在尝试向量化以下代码:
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中。
发布于 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。因此,它实际上等同于执行:
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)发布于 2017-05-04 06:04:24
怎么样
[np.argmax(np.random.multinomial(1,s[i,:])) for i in xrange(s.shape[0])]https://stackoverflow.com/questions/36952419
复制相似问题