89 votes

Comparaison de tableaux numpy contenant des NaN

Pour mon unittest, je veux vérifier si deux tableaux sont identiques. Exemple réduit :

a = np.array([1, 2, np.NaN])
b = np.array([1, 2, np.NaN])

if np.all(a==b):
    print 'arrays are equal'

Cela ne fonctionne pas car nan != nan . Quelle est la meilleure façon de procéder ?

8voto

Alexandre Huat Points 340

Juste pour compléter La réponse de @Luis Albert Centeno vous pouvez plutôt utiliser :

np.allclose(a, b, rtol=0, atol=0, equal_nan=True)

rtol y atol contrôler la tolérance du test d'égalité. En bref, allclose() retours :

all(abs(a - b) <= atol + rtol * abs(b))

Par défaut, ils ne sont pas mis à 0, donc la fonction pourrait retourner True si vos chiffres sont proches mais pas exactement égaux.


PS : "Je veux vérifier si deux tableaux sont identique " >> En fait, vous cherchez égalité plutôt que identité . Ils ne sont pas les mêmes en Python et je pense qu'il est préférable pour tout le monde de comprendre la différence afin de partager le même lexique. ( https://www.blog.pythonlibrary.org/2017/02/28/python-101-equality-vs-identity/ )

Vous testeriez l'identité par mot-clé is :

a is b

7voto

Matheus Araujo Points 141

Quand j'ai utilisé la réponse ci-dessus :

 ((a == b) | (numpy.isnan(a) & numpy.isnan(b))).all()

Il m'a donné quelques erreurs lors de l'évaluation d'une liste de chaînes de caractères.

Il s'agit plutôt de type générique :

def EQUAL(a,b):
    return ((a == b) | ((a != a) & (b != b)))

1voto

ukemi Points 3499

A partir de v1.19 de numpy array_equal supporte une fonction equal_nan argument :

assert np.array_equal(a, b, equal_nan=True)

0voto

camposer Points 11

Pour moi, cela a bien fonctionné :

a = numpy.array(float('nan'), 1, 2)
b = numpy.array(2, float('nan'), 2)
numpy.equal(a, b, where = 
    numpy.logical_not(numpy.logical_or(
        numpy.isnan(a), 
        numpy.isnan(b)
    ))
).all()

PS. Ignore la comparaison lorsqu'il y a un nan

-1voto

NeuronQ Points 2188

Si vous faites cela pour des choses comme des tests unitaires, si vous ne vous souciez pas beaucoup des performances et du comportement "correct" avec tous les types, vous pouvez utiliser ceci d'avoir quelque chose qui fonctionne avec tous les types de tableaux, pas seulement les tableaux numériques. :

a = np.array(['a', 'b', None])
b = np.array(['a', 'b', None])
assert list(a) == list(b)

Casting ndarray s à list s peut parfois être utile pour obtenir le comportement que vous souhaitez dans certains tests. (Mais ne l'utilisez pas dans du code de production, ou avec des tableaux plus grands !)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X