4
respostas

A parte sobre o np.allclose está confusa

Se seguirmos oquê o professor diz, teremos o seguinte texto que encontra-se na imagem que eu enviei. O resultado o np.allclose é uma booleana, ok, true or false. Ele diz que "np.allclose(Moscow_ano3,Moscow_ano4,0.01) -> False, quer dizer que a diferença entre os arrays não é maior que 0.01". Depois ele testa com o seguinte código "np.allclose(Moscow_ano3,Moscow_ano4,10) -> True, quer dizer que a diferença não é maior do que 10". Não faz sentido a False indicar uma diferença "não maior que" e True também indicar uma diferença "maior que". Alguém conseguiria me explicar?

4 respostas

Olá Rennan,

Desculpe se confuso. Eu diria que nós estamos falando a mais coisa de formas diferentes. A tradução literal da documentação diz o seguinte: Retorna True se os dois arrays forem iguais, elemento a elemento dentro de uma tolerância.

Talvez não tenha ficado claro na minha fala a questão de ser elemento a elemento. Mas a sua interpretação do que a função faz está perfeita do meu ponto de vista.

Se você quiser testar melhor essa questão sugiro esse código mais simples. Aqui eu criei dois arrays a e b. A diferença entre o a e o b é o valor 0.01 que foi somando em cada um dos elementos. Se eu aumentar a tolerância para um valor maior que 0.01 a allclose vai retornar o valor True.

import numpy as np

a = np.array([0,1,1,0])
b = a +0.01

np.allclose(a, b, rtol=10)

Olá Allan,

Estou com um pouco de dificuldade de entender o allclose, pois olhando manualmente para os elementos de Moscow_ano3 e Moscow_ano4, existem elementos em que as diferenças são maiores que 10, pela explicação havia entendido que deveria retornar False pois ultrapassa o limite estabelecido. Poderia detalhar melhor esse ponto? Obrigada!Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Olá Marina,

Peço desculpas. Realmente agora que percebi uma falha no meu código. Estou usando o valor 10 como se fosse o parâmetro atol da função. Porém, ele está sendo usado dentro do parâmetro rtol. Então se você trocar o comando por:

np.allclose(Moscow_ano3,Moscow_ano4,atol=10)

O código deve funcionar como esperado.

Em resumo, a função recebe os seguintes parâmetros:

numpy.allclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)

E a conta feita internamente dentro do allclose funciona assim:

np.abs(a - b) <= (atol + rtol * np.abs(b))

Então se a diferença não for mais que o atol a resposta será False.

Obrigado. Vou tentar adicionar uma atividade antes do vídeo explicando isso e corrigir o código.

Muito obrigada!