Numpy广播

时间:2016-02-24 12:40:15

标签: numpy

以下代码给出了(0-11)中元素在数组c的第一行中出现的次数。 (A == C [0])。如何调整此代码,以便它对c中的所有行也是如此,而不仅仅是c [0]。基本上是for循环。

import numpy as np
c=(np.random.rand(2,5)*12).round()
print (c)

a=np.arange(12).reshape(12,1)
print (np.sum(a==c[0],axis=1))

结果应如下所示,但没有for循环:

for n in range(2):
    a=np.arange(12).reshape(12,1)
    print (np.sum(a==c[n],axis=1))

1 个答案:

答案 0 :(得分:1)

如果你必须使用会导致大量内存使用的broadcasting,你可以这样做 -

(c[...,None] == np.arange(12)).sum(1)

对于尺寸更大的c,更好的方法是不要打扰c,只需移动np.arange(12),就像这样 -

(c == (np.arange(12)[:,None,None])).sum(-1).T

这是关于理论 -

的一些证明
In [28]: c=(np.random.rand(2000,5000)*12).round()

In [29]: %timeit (c[...,None] == np.arange(12)).sum(1)
1 loops, best of 3: 423 ms per loop

In [30]: %timeit (c == (np.arange(12)[:,None,None])).sum(-1).T
1 loops, best of 3: 232 ms per loop