[PYTHON] Der Grund, warum Numpys assert_array_equal nicht wie erwartet funktioniert, liegt am dtype.

Überblick

Laut Handbuch vergleicht numpy.testing.assert_array_equal NaN ( np.nan) miteinander, aber es sollte nicht funktionieren.

** Die Ursache stellte sich heraus, dass es nicht wie erwartet funktioniert, wenn dtype`` object ist (wenn es sich um ein gemischtes ndarray handelt) **

Umgebung

Linux-Betriebssystem (Details nicht bestätigt) Conda-Version Python v3.7 und 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.

Umzugskoffer

Bei einem normalen Vergleich ist der Vergleich zwischen NaNs "False", aber "assert_array_equal" vergleicht sie als gleich. Wenn es sich jedoch um ein Array von "float" handelt.

>>> 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)
>>> 

Fall, der sich nicht bewegt

Der Grund für die Angabe von "dtype" beim Erstellen von "a" und "b" ist, dass es sich ansonsten um ein Array von Zeichenfolgen handelt. Für diese Arrays, die als Typ "Objekt" erstellt wurden, schlägt "assert_array_equal" jetzt fehl.

>>> 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

Der Grund, warum Numpys assert_array_equal nicht wie erwartet funktioniert, liegt am dtype.
[Python] Warum pserve nicht funktioniert
Überlegen Sie, warum Kubernetes als "Linux in der Cloud-Welt" beschrieben wird.
Überprüfen Sie Elemente, wenn das importierte Python-Modul nicht wie erwartet funktioniert