我们可以使用
np.bincount据称对这种累积加权计数非常有效的方法,所以这里有一个-
counts = np.bincount(i,v)d[:counts.size] = counts
或者,使用
minlength输入参数,对于一般情况,当
d可以是任何数组,而我们想添加到该数组中时,
d += np.bincount(i,v,minlength=d.size).astype(d.dtype, copy=False)
运行时测试
本节将本文中
np.add.at列出的基础方法
otherpost与本文
np.bincount前面列出的基础方法进行比较。
In [61]: def bincount_based(d,i,v): ...: counts = np.bincount(i,v) ...: d[:counts.size] = counts ...: ...: def add_at_based(d,i,v): ...: np.add.at(d, i, v) ...:In [62]: # Inputs (random numbers) ...: N = 10000 ...: i = np.random.randint(0,1000,(N)) ...: v = np.random.randint(0,1000,(N)) ...: ...: # Setup output arrays for two approaches ...: M = 12000 ...: d1 = np.zeros(M) ...: d2 = np.zeros(M) ...:In [63]: bincount_based(d1,i,v) # Run approaches ...: add_at_based(d2,i,v) ...:In [64]: np.allclose(d1,d2) # Verify outputsOut[64]: TrueIn [67]: # Setup output arrays for two approaches again for timing ...: M = 12000 ...: d1 = np.zeros(M) ...: d2 = np.zeros(M) ...:In [68]: %timeit add_at_based(d2,i,v)1000 loops, best of 3: 1.83 ms per loopIn [69]: %timeit bincount_based(d1,i,v)10000 loops, best of 3: 52.7 µs per loop



