我有一个整数需要根据概率分布分成二进制位.例如,如果我有N=100对象进入[0.02, 0.08, 0.16, 0.29, 0.45]那么你可能会得到[1, 10, 20, 25, 44].
import numpy as np
# sample distribution
d = np.array([x ** 2 for x in range(1,6)], dtype=float)
d = d / d.sum()
dcs = d.cumsum()
bins = np.zeros(d.shape)
N = 100
for roll in np.random.rand(N):
# grab the first index that the roll satisfies
i = np.where(roll < dcs)[0][0]
bins[i] += 1
Run Code Online (Sandbox Code Playgroud)
实际上,N和我的箱数非常大,因此循环并不是一个可行的选择.有什么方法可以将此操作进行矢量化以加快速度吗?
简单版本: 如果我这样做:
import numpy as np
a = np.zeros(2)
a[[1, 1]] += np.array([1, 1])
Run Code Online (Sandbox Code Playgroud)
我得到[0, 1]了输出.但我想[0, 2].这可能是某种方式,使用隐式numpy循环而不是自己循环它?
什么 - 我实际需要做的版本:
我有一个结构化数组,包含索引,值和一些布尔值.我想基于布尔值在那些索引处对这些值求和.很明显,这可以通过一个简单的循环来完成,但似乎应该可以使用聪明的numpy索引(如上所述).
例如,我有一个包含5个元素的数组,我想从数组中填充值,索引和条件:
import numpy as np
size = 5
nvalues = 10
np.random.seed(1)
a = np.zeros(nvalues, dtype=[('val', float), ('ix', int), ('cond', bool)])
a = np.rec.array(a)
a.val = np.random.rand(nvalues)
a.cond = (np.random.rand(nvalues) > 0.3)
a.ix = np.random.randint(size, size=nvalues)
# obvious solution
obvssum = np.zeros(size)
for i in a:
if i.cond:
obvssum[i.ix] += i.val
# is something this …Run Code Online (Sandbox Code Playgroud)