2
votes

Effectuer une opération OR logique sur plusieurs baies NumPy

J'ai le code suivant:

[1 1 1 0]

array3 sera:

array1 = np.array([1,0,1,0])
array2 = np.array([1,1,0,0])

array3 = array1 | array2

Ce code fonctionne bien mais je voudrais l'étendre vers plus de tableaux sans écrire array1 | array2 | array3 | etc .

Quelqu'un connaît-il un moyen efficace de faire cela? Peut-être utiliser .any ()?


2 commentaires

Je ne sais pas comment cela se fait en Python, mais le concept est connu sous le nom de «repli», «réduction» ou «accumulation». Recherchez des fonctions similaires dans le std python.


Haha googler est beaucoup plus facile quand on connaît le terme! Merci beaucoup


4 Réponses :


5
votes

Vous pouvez utiliser reduction avec operator.or_:

import operator
from functools import reduce

reduce(operator.or_, [array1, array2])
# array([1, 1, 1, 0])

Notez que dans Python 3, reduction a été déplacé vers la bibliothèque functools , mais en Python 2, c'est un intégré.


1 commentaires

J'ai opté pour l'autre réponse car je travaille dans numpy. Votre solution a l'air bien aussi et je la garderai à l'esprit la prochaine fois que je n'utiliserai pas np!



4
votes

Je m'en tiens à NumPy ici, mais il existe plusieurs façons de le faire. Voici en utilisant logical_or.reduce.

np.column_stack([array1, array2]).any(axis=1)
# array([ True,  True,  True, False])

Une autre variante utilise l'utilisation de column_stack et any :

np.logical_or.reduce([array1, array2])
# array([ True,  True,  True, False])


2 commentaires

Je pense à np.any ([array1, array2], axis = 0) peut fonctionner ici?


@ Wen-Ben Yup. Mais tout doit encore convertir la liste [array1, array2] en un nouveau tableau. C'est à peu près la même chose que column_stack, peut-être légèrement plus rapide ... peut-être pourrions-nous en apprendre plus sur les horaires :)



3
votes

Puisque vous étiquetez pandas une façon d'utiliser any pour | , si vous avez besoin de & essayez avec tout

pd.DataFrame([array1,array2]).any(1).values


2 commentaires

Oh wow. Je demandais en fait d'incorporer cela dans quelque chose que je fais dans les pandas, donc c'est génial. Je vous remercie!


@HenryDashwood ha, bon codage :-)



1
votes

Vous pouvez également résumer les deux tableaux. Si l'un des éléments est 1, la somme sera 1. Si les deux sont 1, la somme sera 2, auquel cas vous réaffectez la valeur de 1 en utilisant np.where comme

array3 = np.where(array1+array2==2, 1, array1+array2)
# array([1, 1, 1, 0])


0 commentaires