Это потому, что math.nan
является атрибутом уровня модуля, поэтому вы получаете идентичный объект оба раза. Диктофоны CPython имеют ярлык † для проверки личности
>>> any(k == math.nan for k in d)
False
>>> math.nan in d
True
С np.float('nan')
у вас есть вызов функции, каждый раз возвращающий другой экземпляр. Использование встроенного в Python float('nan')
снова будет похоже, это на самом деле не связано с numpy.
>>> np.float('nan') is np.float('nan')
False
>>> math.nan is math.nan
True
>>> float('nan') is float('nan')
False
† Списки, кортежи и т. Д. Также имеют это. См. Создание объекта x таким, что «x in [x]» возвращает False для получения дополнительной информации об этом.