68 votes

Comment effectuer des opérations booléennes par élément sur des tableaux numpy

Par exemple, je voudrais créer un masque qui masque les éléments dont la valeur est comprise entre 40 et 60 :

 foo = np.asanyarray(range(100))
mask = (foo < 40).__or__(foo > 60)

Ce qui a l'air moche, je ne peux pas écrire :

 (foo < 40) or (foo > 60)

car je me retrouve avec :

   ValueError Traceback (most recent call last)
  ...
  ----> 1 (foo < 40) or (foo > 60)
  ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Existe-t-il un moyen canonique d'effectuer des opérations booléennes par élément sur des tableaux numpy avec un bon code ?

104voto

jcollado Points 18325

Avez-vous essayé cela?

 mask = (foo < 40) | (foo > 60)

Remarque : la __or__ dans un objet surcharge l'opérateur au niveau du bit ou ( | ), pas l'opérateur or

18voto

ViennaMike Points 874

Vous pouvez utiliser les opérations logiques numpy . Dans ton exemple :

 np.logical_or(foo < 40, foo > 60)

7voto

Roko Mijic Points 1513

Notez que vous pouvez utiliser ~ pour la négation élément par élément.

 arr = np.array([False, True])
~arr

OUTPUT: array([ True, False], dtype=bool)

De plus, & fait par élément et

 arr_1 = np.array([False, False, True, True])
arr_2 = np.array([False, True, False, True])

arr_1 & arr_2

OUTPUT:   array([False, False, False,  True], dtype=bool)

Ceux-ci fonctionnent également avec la série Pandas

 ser_1 = pd.Series([False, False, True, True])
ser_2 = pd.Series([False, True, False, True])

ser_1 & ser_2

OUTPUT:
0    False
1    False
2    False
3     True
dtype: bool

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