2017-07-24 5 views
6

कास्ट करते समय गलत परिणाम उत्पन्न करता है, इन दोनों डिवीजनों के अलग-अलग परिणाम क्या कारण हैं? मैं बहुत उलझन में हूं क्योंकि कुछ संख्याओं के साथ यह वही परिणाम देता है और कुछ के साथ यह नहीं करता है।नकली पूर्णांक विभाजन कभी-कभी

>>> import numpy as np 
>>> a, b = np.array([844]), np.array([8186]) 
>>> a.dtype, b.dtype 
(dtype('int32'), dtype('int32')) 
>>> np.true_divide(a, b, dtype=np.float32) 
array([ 0.10310286], dtype=float32) 
>>> np.true_divide(a, b, dtype=np.float64) 
array([-12.66666667]) # different result 
>>> np.true_divide(a, b, dtype=np.float32).astype(np.float64) 
array([ 0.10310286]) 

>>> a, b = np.array([1]), np.array([2]) 
>>> np.true_divide(a, b, dtype=np.float32) 
array([ 0.5], dtype=float32) 
>>> np.true_divide(a, b, dtype=np.float64) 
array([ 0.5]) # same results 

विंडोज x64, पायथन 3.5 और 3.6 x64, numpy 1.13.1 पर परीक्षण किया गया।

उत्तर

1

यह bug in numpy है। हालांकि यह माना जाता है कि 2015 में यह तय किया गया था कि ऐसा लगता है कि यह अभी भी समस्याएं पैदा कर रहा है।

प्रकार हस्ताक्षर को हल करने के लिए मजबूर किया कलाकारों की वजह से विफल रहता है, true_divideint8 के लिए इनपुट डाले:

>>> np.int8(844)/np.int8(8186) 
-12.666667 

>>> np.true_divide(844, 8186, dtype=np.float64) 
-12.666666666666666 

आप -128 और 127 के बीच नंबरों के लिए सही परिणाम मिलता है क्योंकि उस श्रेणी में उपलब्ध है int8

समाधान के लिए आप केवल वापसी प्रकार के बजाय पूरा हस्ताक्षर निर्दिष्ट कर सकते हैं:

>>> np.true_divide(844, 8186, signature='ii->d') # int32, int32 -> float64 
0.10310285853896897 

>>> np.true_divide(844, 8186, signature=(np.int32, np.int32, np.float64)) 
0.10310285853896897 
संबंधित मुद्दे