2015-04-17 6 views
5

मैं दो अलग-अलग सरणी के डेटा प्रकारों की तुलना करने के साथ खेल रहा था जो कि दोनों को जोड़ने के लिए उपयुक्त है। मैं खोजने के लिए है कि मैं तुलना कार्रवाई कर सकता खुश था, लेकिन इस प्रक्रिया में निम्नलिखित अजीब व्यवहार की खोज:NumPy डेटा प्रकार तुलना

In [1]: numpy.int16 > numpy.float32 
Out[1]: True 

In [2]: numpy.dtype('int16') > numpy.dtype('float32') 
Out[2]: False 

किसी को भी व्याख्या कर सकते हैं यहाँ क्या चल रहा है? यह NumPy 1.8.2 है।

+0

संयोग से, मैं खोज और 'np.find_common_type' का उपयोग कर समाप्त हो गया लेकिन मैं अभी भी यहाँ क्या चल रहा था में दिलचस्पी रखता हूँ। धन्यवाद! – farenorth

+0

मैं विंडोज पर 'numpy' 1.9.2 का उपयोग कर रहा हूं, और दोनों तुलना 'झूठी' वापस आती हैं। जैसा कि नीचे दिए गए उत्तर में है, यह अर्थहीन है, और इसे पायथन 3 में हटा दिया गया है। – MattDMo

उत्तर

4

पहली तुलना अर्थपूर्ण नहीं है, दूसरा सार्थक है।

>>> type(numpy.int16) 
type 
>>> numpy.int16 > numpy.float32 # I'm using Python 3 
TypeError: unorderable types: type() > type() 

अजगर 3 इस तुलना तुरंत विफल रहता है के बाद से वहाँ type उदाहरण के लिए कोई परिभाषित आदेश है:

numpy.int16 > numpy.float32 के साथ हम दो type वस्तुओं की तुलना कर रहे हैं। पायथन 2 में, एक बूलियन लौटा दिया जाता है लेकिन स्थिरता के लिए भरोसा नहीं किया जा सकता है (यह स्मृति पते या अन्य कार्यान्वयन-स्तर की सामग्री की तुलना करने के लिए वापस आ जाता है)।

दूसरी तुलना पाइथन 3 में काम करता है, और यह लगातार काम करता है (पायथन 2 में समान)। इसका कारण यह है कि अब हम dtype उदाहरणों तुलना कर रहे हैं:

>>> type(numpy.dtype('int16')) 
numpy.dtype 
>>> numpy.dtype('int16') > numpy.dtype('float32') 
False 
>>> numpy.dtype('int32') < numpy.dtype('|S10') 
False 
>>> numpy.dtype('int32') < numpy.dtype('|S11') 
True 

इस आदेश के पीछे तर्क क्या है?

dtype उदाहरणों के अनुसार आदेश दिया जाता है कि किसी को (सुरक्षित रूप से) दूसरे को कास्ट किया जा सकता है या नहीं। एक प्रकार से कम है यदि यह सुरक्षित रूप से उस प्रकार के पर जा सकता है।

तुलना ऑपरेटर के कार्यान्वयन के लिए, descriptor.c देखें; विशेष रूप से arraydescr_richcompare फ़ंक्शन पर।

switch (cmp_op) { 
case Py_LT: 
     if (!PyArray_EquivTypes(self, new) && PyArray_CanCastTo(self, new)) { 
      result = Py_True; 
     } 
     else { 
      result = Py_False; 
     } 
     break; 

अनिवार्य रूप से, NumPy सिर्फ जांच होती है कि दो प्रकार के होते हैं (i) बराबर नहीं, और (ii) कि पहले प्रकार दूसरे प्रकार के साथ ढाले जा सकता है:

यहाँ क्या करने के लिए < ऑपरेटर नक्शे है ।

यह कार्यक्षमता भी np.can_cast रूप NumPy एपीआई में सामने आ रहा है:

3

यह कुछ भी दिलचस्प नहीं है। पायथन 2 ऑब्जेक्ट्स के लिए निरंतर लेकिन अर्थहीन तुलना परिणाम प्रदान करने का प्रयास करता है जो परिभाषित नहीं करते कि एक-दूसरे के साथ तुलना कैसे करें। डेवलपर्स ने फैसला किया कि एक गलती थी, और पायथन 3 में, ये तुलना TypeError उठाएंगी।

+0

दूसरी तुलना * पायथन 3 में विफल नहीं होती है और यह सही नहीं है कि यह अर्थहीन है (जैसा कि पहली तुलना है)। यह करना है कि एक प्रकार को दूसरे में डाला जा सकता है या नहीं। (मैंने इसे समझाते हुए एक जवाब जोड़ा है।) –

+0

@ajcr: हुह। मुझे स्वीकार करना होगा कि मैंने वास्तव में प्रलेखन की जांच नहीं की थी, लेकिन अब मैंने देखा है, मुझे कहीं भी दस्तावेज़ों के लिए कोई तुलना नहीं दिखाई दे रही है।स्रोत जो आप वर्णन करते हैं उससे मेल खाता है, लेकिन क्या यह व्यवहार हमें भरोसा करने की अनुमति है, या यह ऐसा कुछ है जो बिना किसी सूचना के बदल सकता है? क्या यह कहीं भी दस्तावेज है? – user2357112

+0

मुझे तुलनात्मक ऑपरेटरों के इस उपयोग का वर्णन करने वाले किसी दस्तावेज को भी नहीं मिला, या प्रासंगिक मेलिंग सूचियों पर भी कोई एक्सचेंज नहीं मिला। ऐसा लगता है कि यह लाइब्रेरी के उन कोनों में से एक है जिसे अभी तक दस्तावेज नहीं किया गया है। मुझे यकीन नहीं है कि डेवलपर्स भविष्य में रिलीज में व्यवहार को बदल देंगे, लेकिन मैंने निश्चित रूप से इसे पहले कभी नहीं देखा है। 'Can_cast' जैसे कार्य dtypes की तुलना करने के लिए एक बहुत स्पष्ट और अधिक लचीला तरीका प्रतीत होता है। –

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