2013-06-21 11 views
5

इस मामले में, x += yx = x + y से भिन्न परिणाम क्यों उत्पन्न करता है?बेवकूफ, `x = = y`` x = x + y` से भिन्न परिणाम क्यों उत्पन्न करता है?

import numpy as np 

x = np.repeat([1], 10) 
y = np.random.random(len(x)) 

x += y 
print x 
# Output: [1 1 1 1 1 1 1 1 1 1] 

x = x + y 
print x 
# Output: [ 1.50859536 1.31434732 1.15147365 1.76979431 1.64727364 
#   1.02372535 1.39335253 1.71878847 1.48823703 1.99458116] 
+0

वास्तव में डुप्लिकेट की बजाय फ्लोट की एक नई सरणी। संक्षिप्त उत्तर: जादू "मंदर" विधियों के कार्यान्वयन पर निर्भर करता है '__add__' और '__iadd__' –

+3

** यह डुप्लिकेट ** नहीं है, यह' numpy' – jamylak

+0

@jamylak ओह - वास्तव में, अच्छी पकड़, धन्यवाद! –

उत्तर

9

हालांकि जुड़े प्रश्न सामान्य मुद्दे को बताते हैं, इस विशेष मामले के लिए एक संख्यात्मक विशिष्ट स्पष्टीकरण है। असल में, उन उत्तरों का कहना है, "यह शामिल चर के प्रकार पर निर्भर करता है", और जो मैं नीचे दे रहा हूं वह numpy प्रकारों के लिए स्पष्टीकरण है।

जब आप x + y करते हैं, तो नतीजे परिणाम के लिए "सबसे कम आम denominator" डेटाटाइप का उपयोग करता है। चूंकि x int है और y फ़्लोट है, इसका मतलब है कि यह एक फ्लोट सरणी देता है।

लेकिन जब आप x += y करते हैं, तो आप इसे x के प्रकार के अनुरूप करने के लिए मजबूर कर रहे हैं, जो int है। यह दशमलव भाग को छोटा करता है और सभी x मानों को वापस 1 पर छोड़ देता है। इस तरह numpy संवर्धित असाइनमेंट ऑपरेटरों को परिभाषित करता है: यह वापसी मान को असाइनमेंट लक्ष्य के समान ही प्रकार के होने के लिए मजबूर करता है।

आप x = (x + y).astype(int) (स्पष्ट रूप से डीटीपी को वापस करने के लिए मजबूर कर रहे हैं) द्वारा दूसरे उदाहरण से पहला व्यवहार प्राप्त कर सकते हैं। आप x = np.repeat([1.0], 10) देकर पहले उदाहरण से दूसरा व्यवहार प्राप्त कर सकते हैं (फ्लोट x का उपयोग करके टाइपटाइप फ्लोट है, इसलिए अब आप बिना छेड़छाड़ के y जोड़ सकते हैं)।

2

यह __add__ और __iadd__ तरीकों

हालांकि आम तौर पर अंतर

>>> x = np.repeat([1], 10) 
>>> y = np.random.random(len(x)) 
>>> x += y 
>>> x 
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) 

विपरीत के साथ

>>> x = np.repeat([1.0], 10) 
>>> x += y 
>>> x 
array([ 1.05192255, 1.00844068, 1.27569982, 1.40997015, 1.17270114, 
     1.27335121, 1.70719855, 1.72778867, 1.64679031, 1.23241938]) 

तो __iadd__ अपरिवर्तनीय वस्तुओं बनाम परिवर्तनशील के बीच देखा जाता है के बीच अंतर की वजह से है इसके अलावा वापस कटौती करने के लिए कारण बन रहा है पूर्णांक जब एक्स int प्रकार

है यह समझ में आता है, तो आप इसके बारे में सोचते - एक्स जादुई परिवर्तन नहीं कर सकते की यह तत्व है (जहां यह उन अतिरिक्त बाइट्स संग्रहीत करेंगे)

__add__ के लिए वहाँ producting कोई समस्या नहीं है इन्स

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