2010-07-21 27 views
64

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

Actualmente estoy usando

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

pero no me gusta que: \

Respuesta

13

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

numpy.allclose(arr1, arr2) 

pero no es lo mismo.

Una alternativa, casi lo mismo que el ejemplo es:

numpy.alltrue(arr1 == arr2) 

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

84

revisa las funciones afirmativas en numpy.testing, p. Ej.

assert_array_equal

para las matrices de puntos de prueba igualdad flotante podría fallar y assert_almost_equal es más fiable.

actualización

Algunas versiones hace numpy obtuvieron assert_allclose que ahora es mi favorito ya que nos permite especificar tanto el error absoluto y relativo y no requiere de redondeo decimal como el criterio de proximidad.

+0

¿Cómo interactúa con este unittest? Creo que algunas palabras sobre el tema serían útiles. –

+0

Nunca uso unittest. Sin embargo, funciona muy bien con los nosetest que son usados ​​por Numpy, Scipy y Statmodels. Simplemente use las afirmaciones dentro de una función o método de prueba. – user333700

+0

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 sean en realidad matrices, pero supongo que sería necesario verificar el tipo manualmente. – max

7

Me parece que el uso de 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 más uniforme con el resto de sus casos de prueba, obtiene la descripción del error unittest y es realmente fácil de implementar.

3

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

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

+2

Desafortunadamente, no funciona bien cuando las matrices son del tipo 'float'. Realmente necesitamos 'assertSequenceAlmostEqual' – grwlf

0

En mis pruebas que utilizan este:

try: 
    numpy.testing.assert_array_equal(arr1, arr2) 
    res = True 
except AssertionError as err: 
    res = False 
    print (err) 
self.assertTrue(res) 
Cuestiones relacionadas