2013-10-30 3 views
59

के साथ नकली सरणी असाइनमेंट उदाहरण के लिए, यदि हमारे पास एक numpy array A है, और हम एक ही तत्व के साथ एक numpy array B चाहते हैं।कॉपी

इन तरीकों के बीच क्या अंतर है? अतिरिक्त मेमोरी आवंटित कब होती है, और यह कब नहीं है?

  1. B = A
  2. B[:] = A (एक ही B[:]=A[:] के रूप में?)
  3. numpy.copy(B, A)

उत्तर

69

पर एक नज़र सभी तीन संस्करणों अलग बातें हैं।

  1. यह पहले से ही A नाम वाले मौजूदा वस्तु के लिए एक नया नाम B बांधता है। बाद में वे एक ही ऑब्जेक्ट को संदर्भित करते हैं, इसलिए यदि आप एक स्थान को संशोधित करते हैं, तो आप दूसरे के माध्यम से भी परिवर्तन देखेंगे।

  2. एक मौजूदा सरणी B में A से मूल्यों

    यह प्रतियां। काम करने के लिए दो सरणी के समान आकार होना चाहिए। B[:] = A[:] वही काम करता है (लेकिन B = A[:] कुछ और ऐसा करेगा)।

  3. यह कानूनी वाक्यविन्यास नहीं है। आप शायद B = numpy.copy(A) मतलब था। यह लगभग 2 जैसा ही है, लेकिन यह B सरणी का पुन: उपयोग करने के बजाय, एक नई सरणी बनाता है। यदि पिछले B मान के अन्य संदर्भ नहीं थे, तो अंतिम परिणाम 2 जैसा ही होगा, लेकिन यह प्रतिलिपि के दौरान अस्थायी रूप से अधिक स्मृति का उपयोग करेगा।

    संपादित करें: या शायद आप numpy.copyto(B, A), जो कानूनी है, और 2 के बराबर है?

+0

'बी = एक [:]' _not_ बिल्कुल 1 के रूप में एक ही बात करता है! 'ए = [1, 2, 3] आज़माएं; बी = ए [:]; b.append (4); प्रिंट (ख); प्रिंट (क) '। यह एक नए संदर्भ को परिभाषित करता है और इसमें प्रतिलिपि बनाता है। –

+4

@Mr_and_Mrs_D: सूक्ष्म सरणी सूचियों की तुलना में अलग-अलग काम करते हैं। सरणी को स्लाइस करने से कोई प्रतिलिपि नहीं बनती है, यह मौजूदा सरणी के डेटा पर एक नया दृश्य बनाता है। – Blckknght

+3

ओह मैं सही खड़ा हूँ - धन्यवाद। आइए मेरी गलती यहां रखें क्योंकि कई पाइथन प्रोग्रामर आश्चर्यचकित होंगे :) –

18
  1. B=A एक संदर्भ बनाता है
  2. B[:]=A एक गहरी प्रतिलिपि बनाता है
  3. numpy.copy(B,A) एक प्रति

अंतिम दो को अतिरिक्त मेमोरी की आवश्यकता है।

संपादित करें: इस Question

4

यह वह जगह है मेरे लिए केवल काम कर जवाब:

B=numpy.array(A) 
संबंधित मुद्दे