2015-02-05 11 views
13

चेतावनी के कारण भविष्य चेतावनी होता है जब आप कुछ इस तरह क्या करता है:क्यों "numpy.asarray (...) में कोई नहीं" एक भविष्य

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

जो वर्तमान में रिटर्न False, लेकिन मैं समझता हूँ कि एक वापस आ जाएगी अम्पी के भविष्य के संस्करण में [False,False,False,True] युक्त सरणी।

जैसा कि on the numpy discussion list पर चर्चा की गई है, इसके आसपास a is None का परीक्षण करना है।

क्या मुझे confuses एक सूची की तुलना में एक 1 डी सरणी के साथ 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 

संपादित करें (टिप्पणी देखें) - वहाँ वास्तव में दो अलग-अलग प्रश्न हैं:

  1. क्यों क्या यह FutureWarning का कारण बनता है - None in numpy.asarray(...) के भविष्य के व्यवहार की तुलना अब क्या हो सकती है?
  2. से in के व्यवहार में अंतर क्यों; क्या मैं परीक्षण कर सकता हूं कि मेरे सरणी में None किसी सूची में परिवर्तित किए बिना या for लूप का उपयोग कर रहा है?

Numpy संस्करण 1.9.1, पायथन 3.4.1

+1

आपकी सरणी में 'कोई नहीं' क्यों होगा? 'कोई नहीं' वाले उदाहरण के 'dtype' को देखें। क्या तुम यही चाहते हो? क्या आप किसी भी मौके से 'एनपीएनएन' के साथ 'कोई नहीं' भ्रमित कर रहे हैं? – hpaulj

+0

मैं डेटा का उपयोग कर रहा हूं जिसमें 'कोई नहीं' हो सकता है। मुझे पता है कि 'कोई नहीं' 'np.nan' नहीं है। मेरी सटीक स्थिति मेरे उदाहरण की तुलना में अधिक जटिल है लेकिन यह वास्तव में प्रश्न के लिए प्रासंगिक नहीं है। 'dtype' को देखते हुए हालांकि काम करता है। धन्यवाद। संयोग से, एनपी.एएसएआरएएन ([1,2,3, एनपीएनएनएन] में 'एनपीएनएनएन' 'भी' झूठी 'वापस आ जाएगी। तो हो सकता है कि मेरा प्रश्न सामान्य रूप से 'in' और numpy arrays के बारे में होना चाहिए। – szmoore

+0

हालांकि, यदि आप किसी मैट्रिक्स से एक टुकड़ा लेते हैं, तो 'dtype' अभी भी' ऑब्जेक्ट 'होगा, जिसमें उसमें' कोई नहीं 'है, भले ही उस टुकड़े में' कोई नहीं 'हो। – szmoore

उत्तर

7

भविष्य चेतावनी होता है जब आप कुछ इस तरह करते हैं:

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

जो वर्तमान में रिटर्न False, लेकिन मुझे समझ में होगा Numpy के भविष्य के संस्करण में [False,False,False,True] युक्त एक सरणी वापस करें।

जैसा कि मैंने टिप्पणियों में उल्लेख किया है, आपका उदाहरण गलत है। Numpy के भविष्य के संस्करण के बराबर नहीं है कि सरणी में प्रत्येक तत्व के लिए , यानी False लौटाएंगे। यह, साथ कैसे तत्व के लिहाज से अन्य अदिश मूल्यों की तुलना वर्तमान में काम करते हैं और अधिक सुसंगत है जैसे:

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) 

क्या मुझे confuses एक सूची

की तुलना में एक 1 डी सरणी के साथ in कीवर्ड के इस व्यवहार है

जब आप x in y का परीक्षण करते हैं, तो आप y.__contains__(x) पर कॉल कर रहे हैं। जब y एक सूची है, __contains__ मूल रूप से इस की तर्ज पर कुछ करता है:

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

है कि यह परीक्षण कहने के लिए:

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

जहां तक ​​मेरा बता सकते हैं, np.ndarray.__contains__(x) इस के बराबर करता है पहले सरणी पर तत्व-वार समानता पहले (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.nan (see here for the rationale behind this)। यह समझने के लिए कि दूसरा मामला True क्यों लौटाता है, याद रखें कि list.__contains__() समानता (==) की जांच करने से पहले पहचान (is) के लिए पहले जांच करता है। चूंकि np.nan is np.nan, दूसरा मामला True वापस करेगा।

+1

क्षमा करें! मैंने नहीं देखा कि मेरा उदाहरण '1,2,3, कोई नहीं] == कोई नहीं '' 1,2,3,4] == कोई नहीं' - मैंने प्रश्न को सही किया है। – szmoore

+0

अच्छा जवाब, धन्यवाद। – szmoore

संबंधित मुद्दे