web-dev-qa-db-fra.com

Masque numpy pour compter le nombre d'éléments satisfaisant une condition

Comment utiliser Numpy pour vectoriser cela en boucle?

count=0
arr1 = np.random.Rand(184,184)
for i in range(arr1.size[0]):
    for j in range(arr1.size[1]):
        if arr1[i,j] > 0.6:
            count += 1
print count

J'ai essayé:

count=0
arr1 = np.random.Rand(184,184)
mask = (arr1>0.6)
indices = np.where(mask)
print indices , len(indices) 

Je m'attendais à ce que len (indices) donne le nombre, mais ce n'est pas le cas. Toutes suggestions s'il vous plaît.

7

Obtenez un masque booléen et comptez simplement les "vrais":

(arr1 > 0.6).sum()
21
cs95

np.count_nonzero devrait être un peu plus rapide que la somme:

np.count_nonzero(arr1 > 0.6)

En fait, c'est trois fois plus rapide

>>> from timeit import repeat
>>> kwds = dict(globals=globals(), number=10000)
>>> 
>>> arr1 = np.random.Rand(184,184)
>>> 
>>> repeat('np.count_nonzero(arr1 > 0.6)', **kwds)
[0.15281831508036703, 0.1485864429268986, 0.1477385900216177]
>>> repeat('(arr1 > 0.6).sum()', **kwds)
[0.5286932559683919, 0.5260644309455529, 0.5260107989888638]
13
Paul Panzer

Vous pouvez également utiliser l'attribut size du tableau Numpy:

arr1 = np.random.Rand(184,184)

arr1[ arr1 > 0.6 ].size
2
Sanjay235