2017-02-16 4 views
1

Насколько я понимаю, == проверяет равенство стоимости, а is проверяет идентичность структуры за значением (как, скажем, === в некоторые другие языки).np.isnan() == False, но np.isnan() не является ложным

Учитывая, что я не понимаю следующее:

np.isnan(30) == False 
Out[19]: 
True 
np.isnan(30) is False 
Out[20]: 
False 

Это, кажется, не быть в случае с другими проверки личности:

(5 == 4) == False 
Out[22]: 
True 
(5 == 4) is False 
Out[23]: 
True 

Он появляется, как будто np.isnan() возвращается False как но не как личность. Почему это так?

+5

Вы никогда не должны испытать на 'false' или' true' в первую очередь. Используйте 'if np.isnan (..)' и 'if not np.isnan (..)'. Нет требования, чтобы интерпретатор Python использовал только одну копию объектов логического значения, очевидно, что у Numpy нет. –

+0

@MartijnPieters, который кажется скорее комментарием стиля (который я ценю), но не как ответ на поведение функции? – FooBar

+0

(То есть, в то время как я * должен * не выполнять эту операцию, I * должен уметь * делать это. No?) – FooBar

ответ

2

np.isnan(30)return s np.False_, который отличается от False; не полагайтесь на это, хотя.

>>> import numpy as np 
>>> np.isnan(30) is np.False_ 
True 
>>> np.False_ is False 
False 
>>> 
8

numpy.isnan() возвращает совместимый объект типа:

>>> import numpy 
>>> type(numpy.isnan(0)) 
<class 'numpy.bool_'> 

Это обычай булево, которые могут быть эффективно хранить в Numpy массивы, см Numpy's Data Types documentation. numpy.isnan() функция может также работать с массивами, производя другой массив с результатами:

>>> numpy.isnan(numpy.array([1, 2])) 
array([False, False], dtype=bool) 

где снова dtype это логический объект Numpy.

Python не гарантирует, что логические операции должны всегда возвращать одноэлементное булевское значение. Вы никогда не должны тестировать is True или is Falseв любом случае. Используйте numpy.isnan() выход непосредственно в логических операциях, используйте not для проверки ложных значений:

if numpy.isnan(foo): 

и

if not numpy.isnan(bar): 
+1

Это оказалось увлекательным набегом.Я обнаружил, что numpy также имеет функцию 'bool', которая является такой же, как' builtins.bool'. * царапины head *. Поэтому 'numpy.bool_' - это numool's bool, но' numpy.bool' - это bool Python. – kojiro

+0

@kojiro: это .. возможно, утечка глобального. –

+1

Так скажи нам '__all__'. – kojiro

Смежные вопросы