Почему np.float ('nan') вызывает проблемы с dicts, а math.nan - нет? - PullRequest
2 голосов
/ 31 октября 2019

Как и в этот вопрос , который показывает, как использование nan из numpy вызывает проблемы с dict, почему math.nan ведет себя по-другому? (Python3)

import math
import numpy as np

d = {math.nan:'baz', math.nan:'bip' }
print(d)
e = {np.float('nan'):'foo', np.float('nan'):'bar' }
print(e)

Вывод

{nan: 'bip'}
{nan: 'foo', nan: 'bar'}

1 Ответ

3 голосов
/ 31 октября 2019

Это потому, что 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 для получения дополнительной информации об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...