Le meilleur moyen d'affirmer l'égalité numpy.array?

103

Je veux faire des tests unitaires pour mon application et je dois comparer deux tableaux. Puisque array.__eq__renvoie un nouveau tableau (donc TestCase.assertEqualéchoue), quelle est la meilleure façon d'affirmer l'égalité?

J'utilise actuellement

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

mais je n'aime pas vraiment ça

fabricant
la source
1
notez que votre exemple peut donner Vrai de manière inattendue, par exemple (np.array([1, 1]) == np.array([1])).all()donnera Vrai
M. Bernhardt
self.assertTrue (np.array_equal (array1, array2))
Miszo97

Réponses:

120

vérifier les fonctions d'assert dans numpy.testing, par exemple

assert_array_equal

pour les tableaux à virgule flottante, le test d'égalité peut échouer et assert_almost_equalest plus fiable.

mettre à jour

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

Josef
la source
18
Comment cela interagit-il avec unittest? Je pense que quelques mots à ce sujet seraient utiles.
Ramon Martinez
Je n'utilise jamais unittest. Cependant, cela fonctionne très bien avec nosetests qui sont utilisés par les modèles numpy, scipy et stats. Utilisez simplement les assertions dans une fonction ou une méthode de test.
Josef le
Cela ne vérifie pas que les deux arguments sont tous deux des tableaux numpy. Par exemple, il réussirait sur un tableau et une liste. Pour les tests, il peut être utile de vérifier qu'il s'agit bien de tableaux, mais je suppose qu'il faudrait vérifier manuellement le type?
max
4
@RamonMartinez assert_allclose semble bien jouer avec unittest :)
kotakotakota
4
@RamonMartinez si vous utilisez Python, unittestvous pouvez l'utiliser self.assertIsNone(np.testing.assert_array_equal(a, b))tel quel Nonesi les tableaux sont égaux.
mjkrause
24

Je pense que (arr1 == arr2).all()c'est plutôt joli. Mais vous pouvez utiliser:

numpy.allclose(arr1, arr2)

mais ce n'est pas tout à fait pareil.

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

numpy.alltrue(arr1 == arr2)

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

SiggyF
la source
18

Je trouve que l'utilisation self.assertEqual(arr1.tolist(), arr2.tolist()) est le moyen le plus simple de comparer des tableaux avec unittest.

Je suis d'accord que ce n'est pas la solution la plus jolie et ce n'est probablement pas la plus rapide, mais c'est probablement plus uniforme avec le reste de vos cas de test, vous obtenez toute la description d'erreur la plus simple et c'est vraiment simple à mettre en œuvre.

Asimoneau
la source
1
Notez que cela ne fonctionnera pas bien avec np.nan, car np.nan != np.nanet la self.assertEqualtentative ne pourra pas en tenir compte.
blacksite le
5

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.

HagaiH
la source
5
Malheureusement, cela ne fonctionne pas bien lorsque les tableaux sont de floattype. Nous avons vraiment besoinassertSequenceAlmostEqual
grwlf
3

Dans mes tests, j'utilise ceci:

try:
    numpy.testing.assert_array_equal(arr1, arr2)
    res = True
except AssertionError as err:
    res = False
    print (err)
self.assertTrue(res)
Edo user1419293
la source
1

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

schiebermc
la source
4
Veuillez ajouter un peu de contexte
Tobias Wilfert