Numpy广播

Numpy广播,numpy,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 rang

下面的代码给出了(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))
如果您必须使用会导致大量内存使用的内存,您可以这样做-

(c[...,None] == np.arange(12)).sum(1)
对于更大的
c
,一个更好的方法是不要打扰
c
,只是四处走动
np.arange(12)
,就像这样-

(c == (np.arange(12)[:,None,None])).sum(-1).T
这是该理论的一些证据-


哇,太棒了!什么是。。。代表什么?我在房间里什么也找不到doc@nickpick我叫它——把所有东西都扔到前面去。因此,基本上将所有DIM推到前面,因此对于这种情况,基本上与
c[:,:,None]
相同。
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