मैं धीरे-धीरे view
एस और copy
एस के बीच अंतर, साथ ही उत्परिवर्तनीय बनाम अपरिवर्तनीय प्रकारों के बीच अंतर को समझने की कोशिश कर रहा हूं।उन्नत इंडेक्सिंग कॉपी सरणी डेटा के साथ असाइनमेंट करता है?
यदि मैं 'advanced indexing' के साथ किसी सरणी का हिस्सा एक्सेस करता हूं तो इसे एक प्रतिलिपि वापस लेनी होगी। यह सच हो रहा है:
In [1]: import numpy as np
In [2]: a = np.zeros((3,3))
In [3]: b = np.array(np.identity(3), dtype=bool)
In [4]: c = a[b]
In [5]: c[:] = 9
In [6]: a
Out[6]:
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
c
के बाद से सिर्फ एक प्रति है, यह डेटा साझा नहीं करता और इसे बदलने a
उत्परिवर्तित नहीं करता है। बहरहाल, यह क्या मुझे confuses है:
In [7]: a[b] = 1
In [8]: a
Out[8]:
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
तो, ऐसा लगता है, भले ही मैं उन्नत अनुक्रमण का उपयोग करें, काम अभी भी एक दृश्य के रूप में छोड़ दिया पर बात व्यवहार करता है। लाइन 2 में स्पष्ट रूप से a
लाइन 2 में a
के समान ऑब्जेक्ट/डेटा है, क्योंकि c
पर इसका कोई प्रभाव नहीं पड़ता है।
तो मेरा प्रश्न: a
लाइन 8 में वही वस्तु/डेटा पहले (पाठ्यक्रम के विकर्ण की गणना नहीं) है या यह एक प्रति है? दूसरे शब्दों में, a
का डेटा नए a
पर कॉपी किया गया था, या उसका डेटा जगह में बदल गया था?
उदाहरण के लिए, यह पसंद है:
x = [1,2,3]
x += [4]
या की तरह:
y = (1,2,3)
y += (4,)
मैं क्योंकि या तो मामले में यह जांच करने के लिए कैसे पता नहीं है, a.flags.owndata
True
है। अगर मैं इस बारे में किसी भ्रमित तरीके से सोच रहा हूं तो कृपया एक अलग प्रश्न का विस्तार करने या जवाब देने में संकोच न करें।
मुझे लगता है कि यह स्पष्ट रूप से numpy दस्तावेज में स्पष्ट रूप से इंगित करने के लायक होगा कि तथ्य यह है कि जब भी lvalue के रूप में उपयोग किया जाता है तो उन्नत अनुक्रमण भी मूल सरणी को संशोधित करेगा। – vehsakul