jonhhy Posted September 2, 2022 at 01:36 PM Report Share #627090 Posted September 2, 2022 at 01:36 PM 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: X = np.array([-1, 2, 0, -4, 5, 6, 0, 0, -9, 10]) mask = (X == 2) | (X == 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 More sharing options...
pwseo Posted December 23, 2022 at 12:21 PM Report Share #629143 Posted December 23, 2022 at 12:21 PM @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). 2 Report Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now