2010-07-21 6 views
64

Je veux faire des tests unitaires pour mon application, et j'ai besoin de comparer deux tableaux. Puisque array.__eq__ renvoie un nouveau tableau (donc TestCase.assertEqual échoue), quelle est la meilleure façon d'affirmer l'égalité?Quelle est la meilleure façon d'affirmer l'égalité de numpy.array?

Actuellement, je suis en utilisant

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

mais je ne pas vraiment comme ça: \

Répondre

13

Je pense que (arr1 == arr2).all() semble assez agréable. Mais vous pouvez utiliser:

numpy.allclose(arr1, arr2) 

mais ce n'est pas tout à fait la même chose.

Une alternative, presque le même que votre exemple est la suivante:

numpy.alltrue(arr1 == arr2) 

Notez que scipy.array est en fait un numpy.array de référence. Cela facilite la recherche de la documentation.

84

vérifier les fonctions d'assertion dans numpy.testing, par ex.

assert_array_equal

pour les tableaux à virgule flottante test d'égalité peut échouer et assert_almost_equal est plus fiable.

mise à jour

Quelques versions il y a obtenu numpy assert_allclose qui est maintenant mon préféré car il nous permet de spécifier l'erreur absolue et relative et ne nécessite pas l'arrondi décimal comme critère de proximité.

+0

Comment cette interaction avec unittest? Je pense que quelques mots à ce sujet seraient utiles. –

+0

Je n'utilise jamais unittest. Cependant, cela fonctionne très bien avec nosetests qui sont utilisés par numpy, scipy et statsmodels. Utilisez simplement les affirmations dans une fonction ou une méthode de test. – user333700

+0

Cela ne vérifie pas que les deux arguments sont tous les deux des tableaux numpy. Par exemple, il réussirait sur un tableau et une liste. Pour tester, il peut être utile de vérifier que ce sont réellement des tableaux, mais je suppose qu'il faudrait vérifier manuellement le type? – max

7

Je trouve que l'utilisation de self.assertEqual(arr1.tolist(), arr2.tolist()) est la façon la plus simple de comparer des tableaux avec unittest. Je suis d'accord que ce n'est pas la plus belle solution et qu'elle n'est probablement pas la plus rapide mais elle est probablement plus uniforme avec le reste de vos cas de test, vous obtenez toutes les descriptions d'erreurs unittest et c'est vraiment simple à implémenter.

3

Depuis Python 3.2, vous pouvez utiliser assertSequenceEqual(array1.tolist(), array2.tolist()).

Cela a la valeur ajoutée de vous montrer les éléments exacts dans lesquels les tableaux diffèrent.

+2

Malheureusement, cela ne fonctionne pas bien lorsque les tableaux sont de type 'float'. Nous avons vraiment besoin de 'assertSequenceAlmostEqual' – grwlf

0

Dans mes tests, j'utiliser ceci:

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