0
votes

appliquer un opérateur booléen parmi tous les éléments d'un tableau

Existe-t-il un moyen pratique d'appliquer le même opérateur booléen (disons ou ) à tous les éléments d'un tableau sans utiliser une boucle for ?

Je vais clarifier ce dont j'ai besoin avec un exemple:

import numpy as np
a=np.array([[1,0,0],[1,0,0],[0,0,1]])
b=a[0] | a[1] | a[2]
print b

Quelle est la manière synthétique d'appliquer l'opérateur booléen ou à tous les tableaux d'une matrice comme je l'ai fait ci-dessus?


3 commentaires

qu'entend-on par synthétique ?


Je veux dire essentiellement sans boucle for . Je me demande s'il existe une fonction numpy ou quelque chose de similaire pour appliquer simplement l'opérateur ou à tous les éléments comme je viens de le faire manuellement.


| n'est qu'un OU logique pour les tableaux booléens. Votre b = a [0] | a [1] | a [2] fait des OU au niveau du bit.


4 Réponses :


0
votes

Vous pouvez utiliser la fonction réduire pour cela:

from functools import reduce

a = np.array([[1,0,0],[1,0,0],[0,0,1]])
reduce(np.bitwise_or, a)


1 commentaires

Il est plus efficace d'utiliser ufunc.reduce , c'est-à-dire np.logical_or.reduce (a) ou np.any (a, axis = 0)



3
votes

La façon habituelle de faire cela serait d'appliquer numpy.any le long d'un axe:

numpy.logical_or.reduce(a, axis=0)

Cela dit, il existe également un moyen de le faire via l'opérateur plus directement. NumPy ufuncs a une méthode reduction qui peut être utilisé pour les appliquer le long d'un axe d'un tableau, ou sur tous les éléments d'un tableau. En utilisant numpy.logical_or.reduce , nous pouvons exprimer cela comme

numpy.any(a, axis=0)

Cela ne revient pas beaucoup, car la plupart des ufuncs que vous voudriez call reduction on a déjà défini des fonctions d'assistance équivalentes. add a somme , multiplier a prod , logical_and a tout , logical_or a any , maximum a amax et minimum a amin.


0 commentaires

1
votes

essayez soit:

df.any(axis=0)

ou

np.apply_along_axis(any, 0, arr)

ou si vous souhaitez utiliser des pandas pour une raison quelconque,

np.any(arr, axis=0)


0 commentaires

0
votes

REMARQUE: je ne suis pas un expert en numby, donc je fais une hypothèse ci-dessous;

Dans votre exemple, b compare les tableaux les uns aux autres, donc il demande:

" Y a-t-il des éléments dans un [0] OU des éléments dans un 1 a > OU des éléments dans un 2 "est-ce votre objectif? dans ce cas, vous pouvez utiliser intégré à any () p >

par exemple (changé numby en une simple liste de listes):

a=np.array([[1,0,0],[1,0,0],[0,0,1]])
b=a.any()
print b

b sera Vrai

si toutefois, vous voulez savoir si l'un de ses éléments est vrai, par exemple, vous voulez savoir si un [0] [0] OU un 0 | a 0 | a [1] [0] | ...

vous pouvez utiliser la carte intégrée a>, donc quelque chose comme:

a=[[1,0,0],[1,0,0],[0,0,1]]
b=any(map(any, a)
print b

b sera toujours True

Remarque: ci-dessous est basé sur la recherche de la documentation NumPy, pas une expérience réelle.

Pour NumPy, vous pouvez également utiliser NumPy any () option quelque chose comme

a=[[1,0,0],[1,0,0],[0,0,1]]
b=any(a)
print b

ou, si vous faites quand même tous les nombres, vous pouvez additionner le tableau et voir si c'est le cas! = 0


0 commentaires