91 votes

Compter toutes les valeurs d'une matrice inférieures à une valeur.

Je dois compter toutes les valeurs d'une matrice (tableau à deux dimensions) qui sont inférieures à 200.

Le code que j'ai écrit pour cela est :

za=0   
p31 = numpy.asarray(o31)   
for i in range(o31.size[0]):   
    for j in range(o32.size[1]):   
        if p31[i,j]<200:   
            za=za+1   
print za

o31 est une image et je la convertis en une matrice, puis je trouve les valeurs.

Existe-t-il un moyen plus simple de procéder ?

131voto

nneonneo Points 56821

C'est très simple avec les tableaux de booléens :

p31 = numpy.asarray(o31)
za = (p31 < 200).sum() # p31<200 is a boolean array, so `sum` counts the number of True elements

110voto

abought Points 827

En numpy.where est votre ami. Comme elle est implémentée pour tirer pleinement parti du type de données tableau, pour les grandes images, vous devriez constater une amélioration de la vitesse par rapport à la solution purement python que vous fournissez.

En utilisant directement numpy.where, vous obtiendrez un masque booléen indiquant si certaines valeurs correspondent à vos conditions :

>>> data
array([[1, 8],
       [3, 4]])
>>> numpy.where( data > 3 )
(array([0, 1]), array([1, 1]))

Et le masque peut être utilisé pour indexer directement le tableau afin d'obtenir les valeurs réelles :

>>> data[ numpy.where( data > 3 ) ]
array([8, 4])

La suite dépend de la forme que vous souhaitez donner aux résultats.

32voto

Kay Zhu Points 9703

Il existe de nombreuses façons d'y parvenir, comme aplatir et filtrer ou simplement énumérer, mais je pense que l'utilisation de Tableau booléen/masque est la plus simple (et, je crois, la plus rapide) :

>>> y = np.array([[123,24123,32432], [234,24,23]])
array([[  123, 24123, 32432],
       [  234,    24,    23]])
>>> b = y > 200
>>> b
array([[False,  True,  True],
       [ True, False, False]], dtype=bool)
>>> y[b]
array([24123, 32432,   234])
>>> len(y[b])
3
>>>> y[b].sum()
56789

Mise à jour :

Comme l'a répondu nneonneo, si tout ce que vous voulez est le nombre d'éléments qui passe le seuil, vous pouvez simplement le faire :

>>>> (y>200).sum()
3

ce qui est une solution plus simple.


Comparaison de la vitesse avec filter :

### use boolean/mask array ###

b = y > 200

%timeit y[b]
100000 loops, best of 3: 3.31 us per loop

%timeit y[y>200]
100000 loops, best of 3: 7.57 us per loop

### use filter ###

x = y.ravel()
%timeit filter(lambda x:x>200, x)
100000 loops, best of 3: 9.33 us per loop

%timeit np.array(filter(lambda x:x>200, x))
10000 loops, best of 3: 21.7 us per loop

%timeit filter(lambda x:x>200, y.ravel())
100000 loops, best of 3: 11.2 us per loop

%timeit np.array(filter(lambda x:x>200, y.ravel()))
10000 loops, best of 3: 22.9 us per loop

*** use numpy.where ***

nb = np.where(y>200)
%timeit y[nb]
100000 loops, best of 3: 2.42 us per loop

%timeit y[np.where(y>200)]
100000 loops, best of 3: 10.3 us per loop

10voto

Karol Points 331

Voici une variante qui utilise une indexation fantaisiste et qui a les valeurs réelles comme intermédiaire :

p31 = numpy.asarray(o31)
values = p31[p31<200]
za = len(values)

6voto

Ricoter Points 419

Pour compter le nombre de valeurs supérieures à x dans n'importe quel tableau numpy, vous pouvez utiliser :

n = len(matrix[matrix > x])

L'indexation booléenne renvoie un tableau qui contient uniquement les éléments pour lesquels la condition (matrice > x) est remplie. Ensuite, len() compte ces valeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X