La raison pour laquelle assert_array_equal de Numpy ne fonctionne pas comme prévu est due à dtype.

Aperçu

D'après le manuel, numpy.testing.assert_array_equal compare NaN ( np.nan) les uns aux autres de la même manière, mais cela ne devrait pas fonctionner.

** Il s'avère que la cause ne fonctionne pas comme prévu lorsque dtype est ʻobject` (quand il s'agit d'un ndarray mixte) **

environnement

OS Linux (détails non confirmés) Conda version Python v3.7 et Numpy v1.8.1

$ python
Python 3.7.0 (default, Oct  9 2018, 10:31:47) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.

Cas de déménagement

Dans une comparaison normale, la comparaison entre les NaN sera «False», mais «assert_array_equal» les comparera de la même manière. Cependant, s'il s'agit d'un tableau de «float».

>>> import numpy as np
>>> from numpy.testing import assert_array_equal as aae

>>> a = np.array([1, np.nan])
>>> b = np.array([1, np.nan])

>>> a.dtype
dtype('float64')
>>> b.dtype
dtype('float64')

>>> a == b
array([ True, False])
>>> aae(a, b)
>>> 

Affaire qui ne bouge pas

La raison de la spécification de «dtype» lors de la création de «a» et «b» est qu'autrement, ce sera un tableau de chaînes. Pour ces tableaux créés en tant que type ʻobject, ʻassert_array_equal échoue maintenant.

>>> a = np.array([1,'test',np.nan], dtype=object)
>>> b = np.array([1,'test',np.nan], dtype=object)

>>> a.dtype
dtype('O')
>>> b.dtype
dtype('O')

>>> a == b
array([ True,  True, False])
>>> aae(a,b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".../anaconda3/envs/opt/lib/python3.7/site-packages/numpy/testing/_private/utils.py", line 936, in assert_array_equal
    verbose=verbose, header='Arrays are not equal')
  File ".../anaconda3/envs/opt/lib/python3.7/site-packages/numpy/testing/_private/utils.py", line 846, in assert_array_compare
    raise AssertionError(msg)
AssertionError: 
Arrays are not equal

Mismatched elements: 1 / 3 (33.3%)
 x: array([1, 'test', nan], dtype=object)
 y: array([1, 'test', nan], dtype=object)
>>> 

Recommended Posts

La raison pour laquelle assert_array_equal de Numpy ne fonctionne pas comme prévu est due à dtype.
[Python] Pourquoi pserve ne fonctionne pas
Réfléchissez aux raisons pour lesquelles Kubernetes est décrit comme «Linux dans le monde du cloud»
Vérifiez les éléments lorsque le module python importé ne fonctionne pas comme prévu