¿La mejor manera de afirmar la igualdad numpy.array?

103

Quiero hacer algunas pruebas unitarias para mi aplicación y necesito comparar dos matrices. Dado que array.__eq__devuelve una nueva matriz (por lo que TestCase.assertEqualfalla), ¿cuál es la mejor manera de afirmar la igualdad?

Actualmente estoy usando

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

pero realmente no me gusta

fabricante
fuente
1
tenga en cuenta que su ejemplo puede producir True inesperadamente, por ejemplo (np.array([1, 1]) == np.array([1])).all(), dará True
M. Bernhardt
self.assertTrue (np.array_equal (array1, array2))
Miszo97

Respuestas:

120

echa un vistazo a las funciones de aserción en numpy.testing, por ejemplo

assert_array_equal

para matrices de coma flotante, la prueba de igualdad puede fallar y assert_almost_equales más confiable.

actualizar

Hace unas pocas versiones obtuve numpy, assert_allcloseque ahora es mi favorito, ya que nos permite especificar tanto el error absoluto como el relativo y no requiere redondeo decimal como criterio de cercanía.

Josef
fuente
18
¿Cómo interactúa esto con unittest? Creo que algunas palabras al respecto serían útiles.
Ramon Martinez
Nunca uso unittest. Sin embargo, funciona muy bien con las pruebas de nariz que utilizan los modelos numpy, scipy y stats. Simplemente use las afirmaciones dentro de una función o método de prueba.
Josef
Esto no verifica que los dos argumentos sean matrices numpy. Por ejemplo, tendría éxito en una matriz y una lista. Para las pruebas, podría ser útil verificar que en realidad se trata de matrices, pero supongo que sería necesario verificar manualmente el tipo.
máximo
4
@RamonMartinez assert_allclose parece jugar bien con unittest :)
kotakotakota
4
@RamonMartinez si usa Python, unittestpuede usarlo, self.assertIsNone(np.testing.assert_array_equal(a, b))ya que devuelve Nonesi las matrices son iguales.
mjkrause
24

Creo que se (arr1 == arr2).all()ve bastante bien. Pero podrías usar:

numpy.allclose(arr1, arr2)

pero no es exactamente lo mismo.

Una alternativa, casi la misma que su ejemplo es:

numpy.alltrue(arr1 == arr2)

Tenga en cuenta que scipy.array es en realidad una referencia numpy.array. Eso hace que sea más fácil encontrar la documentación.

SiggyF
fuente
18

Encuentro que usar self.assertEqual(arr1.tolist(), arr2.tolist()) es la forma más fácil de comparar matrices con unittest.

Estoy de acuerdo en que no es la solución más bonita y probablemente no sea la más rápida, pero probablemente sea más uniforme con el resto de sus casos de prueba, obtiene toda la descripción del error de la prueba unitaria y es realmente simple de implementar.

asimoneau
fuente
1
Tenga en cuenta que esto no funcionará bien np.nan, ya que np.nan != np.nanel self.assertEqualintento no podrá dar cuenta de eso.
blacksite
5

Desde Python 3.2 puedes usar assertSequenceEqual(array1.tolist(), array2.tolist()).

Esto tiene el valor agregado de mostrarle los elementos exactos en los que difieren las matrices.

HagaiH
fuente
5
Desafortunadamente, no funciona bien cuando las matrices son de floattipo. Realmente lo necesitamosassertSequenceAlmostEqual
grwlf
3

En mis pruebas uso esto:

try:
    numpy.testing.assert_array_equal(arr1, arr2)
    res = True
except AssertionError as err:
    res = False
    print (err)
self.assertTrue(res)
Usuario de Edo1419293
fuente
1

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

Schiebermc
fuente
4
Agregue un poco de contexto
Tobias Wilfert