在numpy中矢量化比较

时间:2014-02-17 13:21:24

标签: numpy comparison broadcast

如何在NumPy中对此循环进行矢量化?它使用来自NumPy的binomial()函数的抽样来估计特定类型的55个事件中m的概率发生的概率,m发生的概率为5%;即估计55Cm。(0.05)^ m。(0.95)^(55-m)。其中55Cm = 55!/(m!。(55-m)!)

import numpy as np
M = 7
m = np.arange(M+1)
ntrials = 1000000
p = np.empty(M+1)
for r in m:
    p[r] = np.sum(np.random.binomial(55, 0.05, ntrials)==r)/ntrials

1 个答案:

答案 0 :(得分:1)

以下是等效代码:

p = np.zeros(M+1)
print p

我想你不打算让你的输出总是全为零,但确实如此!因此,首先要做的是在dtype=float调用中添加np.sum()参数。除此之外,我们可以像这样对整个事物进行矢量化:

samples = np.random.binomial(55, 0.05, (ntrials, M+1))
p = np.sum(samples == m, dtype=float, axis=0) / ntrials

这会产生等效但不相同的结果。原因是随机数生成是以不同的顺序完成的,因此您将得到一个“正确”但与旧代码不同的答案。如果您想要之前的结果相同,可以通过将第一行更改为:

来实现
samples = p.random.binomial(55, 0.05, (M+1, ntrials)).T

然后你以与以前相同的顺序绘制,没有真正的性能损失。