Jump to content

Operator Bitwise


jonhhy

Recommended Posts

Boa tarde P@P,

em termos, de operador para a resolução deste exercício: 

"Given the X numpy array, get numbers equal to 2 or 10"

 

tinha pensado assim:
 

mask = X == (2 or 10) # X == (2 or 10) # your code goes here
X[mask] 

contudo, os valores não me deram certo:

array([2])


Já na resolução, eles fazem desta forma:

= np.array([-1, 2, 0, -4, 5, 6, 0, 0, -9, 10])



mask = (== 2) | (== 10)

X[mask]

e não percebo como funciona este operador bitwise, até porque 2 = 2^1 e 10 = 2^1+2^3..

Grato pela vosso tempo e ajuda, abraço 

 

Jonhhy

Link to comment
Share on other sites

  • 3 months later...

@jonhhy

Se pensares em mask como sendo um conjunto de valores lógicos (booleanos), ajuda. Quando fazes X[mask], estás a dar indicação que pretendes apenas uma selecção de valores presentes em X, indicada por mask; neste caso, pretendes que mask seja, na realidade, [F, T, F, F, F, F, F, F, F, T] (abreviei False para F e True para T).

O teu problema reside em como formulas a tua mask: estás a dizer que pretendes os valores para os quais X == (2 or 10). Ora, se colocares isoladamente a pergunta ao interpretador, obténs o seguinte:

>>> 2 or 10
2

E aqui reside o teu problema. Dado que 2 or 10 é 2, a tua mask, na realidade, corresponde apenas a X == 2. Obténs, correctamente, array([2]), pois é na 2ª posição de X que o valor é 2.

 

Agora vamos à resolução proposta, que implica a utilização do operador |. Vamos primeiro decompor a mask sugerida em duas partes x_eq_2 e x_eq_10:

>>> x_eq_2  = X == 2
>>> x_eq_10 = X == 10
>>> x_eq_2
array([False,  True, False, False, False, False, False, False, False, False])
>>> x_eq_10
array([False, False, False, False, False, False, False, False, False,  True])

Repara que em cada uma das partes, temos uma lista de valores lógicos (booleanos), e o único True corresponde à posição em que X tem os valores de 2 ou 10, respectivamente. Neste caso, os criadores da numpy reutilizaram o operador | (bitwise or) para funcionar mais como um or (logical or), permitindo-te obter uma lista de valores lógicos que se apresenta como True para as posições 2 e 10.

>>> x_eq_2 | x_eq_10
array([False,  True, False, False, False, False, False, False, False,  True])

Logo, esta mask está correcta, e portanto a resposta para X[mask] (ou X[x_eq_2 | x_eq_10]) seria array([ 2, 10]).

Nota importante: o motivo pelo qual a tua mask inicial funciona mal diz respeito à forma como funciona o operador or em Python: perante 2 or 10, o valor 2 é devolvido como resultado (sem qualquer tipo de operação bitwise envolvida).

  • Vote 2
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.