Melhor maneira de afirmar a igualdade numpy.array?

103

Quero fazer alguns testes de unidade para meu aplicativo e preciso comparar dois arrays. Visto que array.__eq__retorna uma nova matriz (portanto, TestCase.assertEqualfalha), qual é a melhor maneira de afirmar a igualdade?

Atualmente estou usando

self.assertTrue((arr1 == arr2).all())

mas eu realmente não gosto disso

criador
fonte
1
observe que seu exemplo pode render True inesperadamente, por exemplo (np.array([1, 1]) == np.array([1])).all(), renderá True
M. Bernhardt
self.assertTrue (np.array_equal (array1, array2))
Miszo97

Respostas:

119

verifique as funções de declaração em numpy.testing, por exemplo

assert_array_equal

para matrizes de ponto flutuante, o teste de igualdade pode falhar e assert_almost_equalé mais confiável.

atualizar

Algumas versões atrás, numpy obtido, assert_allcloseque agora é meu favorito, pois nos permite especificar os erros absoluto e relativo e não requer arredondamento decimal como critério de proximidade.

Josef
fonte
18
Como isso interage com o unittest? Acho que algumas palavras sobre o assunto seriam úteis.
Ramon Martinez,
Eu nunca uso o unittest. No entanto, funciona muito bem com nosetests que são usados ​​por modelos numpy, scipy e stats. Basta usar as afirmações dentro de uma função ou método de teste.
Josef,
Isso não verifica se os dois argumentos são matrizes numpy. Por exemplo, teria sucesso em uma matriz e uma lista. Para teste, pode ser útil verificar se esses são realmente arrays, mas acho que seria necessário verificar manualmente o tipo.
máx.
4
@RamonMartinez assert_allclose parece funcionar bem com unittest :)
kotakotakota
4
@RamonMartinez se você usar Python, unittestvocê pode usar self.assertIsNone(np.testing.assert_array_equal(a, b))como ele retorna Nonese os arrays forem iguais.
mjkrause
24

Eu acho que (arr1 == arr2).all()parece muito bom. Mas você pode usar:

numpy.allclose(arr1, arr2)

mas não é exatamente o mesmo.

Uma alternativa, quase igual ao seu exemplo, é:

numpy.alltrue(arr1 == arr2)

Observe que scipy.array é, na verdade, um numpy.array de referência. Isso torna mais fácil encontrar a documentação.

SiggyF
fonte
18

Eu acho isso usando self.assertEqual(arr1.tolist(), arr2.tolist()) é a maneira mais fácil de comparar arrays com unittest.

Eu concordo que não é a solução mais bonita e provavelmente não é a mais rápida, mas provavelmente é mais uniforme com o resto de seus casos de teste, você obtém todas as descrições de erros de teste de unidade e é muito simples de implementar.

Asimoneau
fonte
1
Observe que isso não funcionará bem com np.nan, pois np.nan != np.nane a self.assertEqualtentativa não será capaz de explicar isso.
Blacksite
5

Desde Python 3.2 você pode usar assertSequenceEqual(array1.tolist(), array2.tolist()).

Isso tem o valor agregado de mostrar os itens exatos nos quais as matrizes diferem.

HagaiH
fonte
5
Infelizmente, ele não funciona bem quando os arrays são do floattipo. Nós realmente precisamosassertSequenceAlmostEqual
grwlf
3

Em meus testes eu uso isto:

try:
    numpy.testing.assert_array_equal(arr1, arr2)
    res = True
except AssertionError as err:
    res = False
    print (err)
self.assertTrue(res)
Usuário Edo 1419293
fonte
1

np.linalg.norm(arr1 - arr2) < 1e-6

Schiebermc
fonte
4
Por favor, adicione algum contexto
Tobias Wilfert