नक़ल सरणी असाइनमेंट कॉपी के साथ


103

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

निम्नलिखित (नीचे देखें) विधियों में क्या अंतर है? अतिरिक्त मेमोरी कब आवंटित की जाती है, और यह कब नहीं है?

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

जवाबों:


127

सभी तीन संस्करण अलग-अलग काम करते हैं:

  1. B = A

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

  2. B[:] = A(उसी के रूप में B[:]=A[:]?)

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

  3. numpy.copy(B, A)

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

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


21
@Mr_and_Mrs_D: Numpy सरणियाँ सूचियों की तुलना में अलग तरीके से काम करती हैं। किसी सरणी को कॉपी करने से कॉपी नहीं बनती है, यह सिर्फ मौजूदा सरणी के डेटा पर एक नया दृश्य बनाता है।
ब्लॅककनथ सेप

क्या मतलब है but B = A[:] would do something more like 1? इसके अनुसार stackoverflow.com/a/2612815 new_list = old_list[:] एक प्रति भी है।
मर्ग्लोम

4
@mrloloom: Numpy सरणियाँ सूचियों की तुलना में अलग तरह से काम करती हैं, जब उनकी सामग्री को स्लाइसिंग और कॉपी करने की बात आती है। एक सरणी स्मृति के एक अंतर्निहित ब्लॉक का "दृश्य" है जहां संख्यात्मक मान संग्रहीत किए जाते हैं। एक स्लाइस की तरह करने some_array[:]से एक नई सरणी ऑब्जेक्ट बन जाएगी, लेकिन उस नए ऑब्जेक्ट में मूल सरणी के समान मेमोरी का दृश्य होगा, जिसे कॉपी नहीं किया गया होगा। इसलिए मैंने कहा कि यह अधिक पसंद है B = A। यह केवल O(1)स्थान और समय लेता है , बजाय O(n)प्रत्येक की एक वास्तविक प्रति की आवश्यकता होगी।
ब्लेककनथ

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

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

एक गहरी प्रतिलिपि बनाने के लिए आपको उपयोग करने की आवश्यकता है B = copy.deepcopy(A)


2
अपने दूसरे उदाहरण की बात कर: B[:] = Aकरता है नहीं वस्तु प्रकार, जैसे की सरणियों की गहरी प्रतिलिपि बनाने के A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')। अब कोशिश करो B[:] = A; B[0][0]=99, यह ए और बी दोनों में पहले तत्व को बदल देगा ! मेरी जानकारी के लिए, एक गहरी प्रतिलिपि की गारंटी देने का कोई और तरीका नहीं है, यहां तक ​​कि एक सुन्न-सरणी की तुलना में,copy.deepcopy
रॉल्फ बारस्ट्रा

11

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

B=numpy.array(A)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.