2017-02-16 117 views
1

就我所知,==檢查值是否相等,is檢查值的結構身份(如===一些其他語言)。np.isnan()==假,但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'。使用'如果np.isnan(..)'和'如果不是np.isnan(..)'。沒有要求Python解釋器只使用1個布爾值對象的副本,顯然Numpy沒有。 –

+0

@MartijnPieters似乎是一個風格評論(我很欣賞),但不是作爲函數行爲的答案? – FooBar

+0

(也就是說,雖然我*不應該做這個操作,我*應該可以*做到這一點。不是嗎?) – 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 Trueis False反正。直接在布爾運算使用numpy.isnan()輸出,使用not來測試假值:

if numpy.isnan(foo): 

if not numpy.isnan(bar): 
+1

這原來是一個迷人的進軍。我發現numpy也有一個'bool'函數,它與'builtins.bool'相同。 *劃傷頭部*。所以'numpy.bool_'是numpy的bool,但'numpy.bool'是Python的bool。 – kojiro

+0

@kojiro:這可能是一個泄露的全球。 –

+1

所以說我們'__all__'。 – kojiro