2015-02-05 66 views
13

,當你做這樣的事情今後發生警告:爲什麼「無在numpy.asarray(......)」引起警示未來

>>> numpy.asarray([1,2,3,None]) == None 

目前返回False,但我知道將返回在未來版本的Numpy中包含[False,False,False,True]的數組。

正如討論的on the numpy discussion list解決方法是測試a is None

什麼讓我困惑的是in關鍵字與一維數組的這種行爲相比列表:

>>> None in [1,2,3,None] 
True 
>>> None in numpy.asarray([1,2,3,None]) 
__main__:1: FutureWarning: comparison to 'None' will result in an elementwise 
    object comparison in the future 
False 
>>> 1 in numpy.asarray([1,2,3,None]) 
True 

EDIT(見註釋) - 實際上有兩個不同的問題:

  1. 爲什麼這是否會導致FutureWarning - 將None in numpy.asarray(...)的未來行爲與現在的行爲進行比較?
  2. 爲什麼從listin行爲的差異;我可以測試我的數組是否包含None而不將其轉換爲列表或使用for循環?

numpy的版本是1.9.1,3.4.1的Python

+1

爲什麼你的數組包含'None'?用'None'查看一個例子的'dtype'。那是你要的嗎?你有沒有把'None'與'np.nan'混淆? – hpaulj

+0

我正在使用可能包含「無」的數據。我知道'None'不是'np.nan'。我的確切情況比我的例子更復雜,但這與問題無關。 看着'dtype'確實可以工作。謝謝。 順便提一下,np.asarray([1,2,3,np.nan])中的np.nan也會返回False。所以也許我的問題應該是關於''in'和numpy數組。 – szmoore

+0

儘管如果你從一個有'None'的矩陣中取一個slice,即使這個slice沒有'None','dtype'仍然是'object'。 – szmoore

回答

7

,當你做這樣的事情今後發生警告:

numpy.asarray([1,2,3,4]) == None 

目前返回False,但我明白會在未來版本的Numpy中返回包含[False,False,False,True]的數組。

正如我在評論中提到,你的例子是不正確。未來版本的numpy將返回[False ,False, False, False],即陣列中每個元素的不等於None。這是它與其它標量值元素方面的比較如何目前的工作更加一致,如:

In [1]: np.array([1, 2, 3, 4]) == 1 
Out[1]: array([ True, False, False, False], dtype=bool) 

In [2]: np.array(['a', 'b', 'c', 'd']) == 'b' 
Out[2]: array([False, True, False, False], dtype=bool) 

什麼讓我困惑的是in關鍵字與一維數組的這種行爲相比列表

當您測試x in y時,您致電y.__contains__(x)。當y是一個列表,__contains__基本上沒有沿着此線的東西:

for item in y: 
    if (item is x) or (item == x): 
     return True 
return False 

據我所知,np.ndarray.__contains__(x)執行的這相當於:

if any(y == x): 
    return True 
else: 
    return False 

也就是說它測試首先將整個數組中的元素相等(y == x將是一個大小爲y的布爾數組)。因爲在你的情況下,你正在測試是否y == None,這將提高FutureWarning出於上述原因。

在評論你也想知道爲什麼

np.nan in np.array([1, 2, 3, np.nan]) 

回報False,但

np.nan in [1, 2, 3, np.nan] 

回報True。第一部分容易解釋爲np.nan != np.nansee here for the rationale behind this)。要理解第二種情況爲什麼返回True,請記住list.__contains__()在檢查相等性(==)之前首先檢查標識(is)。由於np.nan is np.nan,第二種情況將返回True

+1

對不起!我沒有注意到我的例子應該是'[1,2,3,None] == None' not'[1,2,3,4] == None' - 我已經糾正了這個問題。 – szmoore

+0

很好的答案,謝謝。 – szmoore