dúvida com um código numpy
import numpy as np
np.random.seed(42)
A = np.random.randint(0, 5, (8, 3))
B = np.random.randint(0, 5, (2, 2))
C = (A.reshape(8, 3, 1, 1) == B)
contem = C.any(3).any(1).all(1)
linhas = np.where(contem)[0]
print(linhas)
olá a todos, o código abaixo tem sido uma tremenda dor de cabeça pra mim, que como etapa no meu desenvolvimento como cientista de dados, estou aprendendo numpy. No curdo que tenho feito, essa é a resolução pra um exercício, e eu realmente não entendo esse código, e se alguém puder me explicar os pontos nos quais tenho dúvida, ficarei agradecido.
seguem os pontos:
1 - Como a variável 'C' funciona exatamente? Como ela faz essa comparação e por que precisa ser quadridimensional, invés de tridimensional
2 - Como exatamente a variável 'contem' funciona? sei para que servem as funções any e all, mas nunca vi elas encadeadas dessa meneira e nem sei o que devem devolver encadeadas assim
3 - Como eu não entendi direito a variável contem, eu não sei exatamente o porque deste where devolver os números que devolve.
se alguem puder me ajudar, fico exatamente agradecido
nesse momento é muito importante testar e ver na documentação
o que o numpy diz sobre o paremetro de any()
:
Axis or axes along which a logical OR reduction is performed
tendo essa descrição podemos ir testando pra realmente entender o que esta acontecendo, para facilitar vamos pegar só os indices 0 e 1 do C
[[
[[False, False],[False, False]],
[[False, False],[False, False]],
[[False, True],[ True, False]]
],
[
[[False, False],[False, False]],
[[False, False],[False, False]],
[[False, False],[False, True]]
]]
como o any esta com o parametro 3, vai verificar no axes/axis 3 (ou seja o resultado vai ter uma dimensão a menos do q o atual
[[False, False],[False, False]], -> [[F com F da F],[F com F da F]]
[[False, False],[False, False]], -> [[F com F da F],[F com F da F]]
[[False, True],[ True, False]], -> [[F com T da T],[T com F da T]]
],
[
[[False, False],[False, False]], -> [[F com F da F],[F com F da F]]
[[False, False],[False, False]], -> [[F com F da F],[F com F da F]]
[[False, False],[False, True]] -> [[F com F da F],[F com T da T]]
]]
o resultado dessa operação é
[[[False, False],
[False, False],
[ True, True]],
[[False, False],
[False, False],
[False, True]]]
antes tinha lista com uma lista dentro, agora essa lista de dentro foi transformado em boleano pela operação any()
, aplicando essa logica algumas vezes de forma encadeada, any diminui uma dimensão -> any diminui uma dimensão - > all diminui uma dimensão resulta em uma lista com uma unica dimensão
array([ True, False, True, True, False, False, True, False])
o where()
tem q dar uma condição para aplicar caso a condição seja verdadeira, como essa lista é só de boleanos então vai retornar o indice onde é verdadeiro [0, 2, 3, 6]
como não manjo muito de numpy, a questão 1 ficou de fora