Executando verificação de segurança...
2

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

Carregando publicação patrocinada...
2

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

1