शायद 12 विभिन्न सरणी मानों के साथ यह उदाहरण मदद करेगा:
In [207]: x=np.arange(12).reshape(3,4).copy()
In [208]: x.flags
Out[208]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
...
In [209]: x.T.flags
Out[209]:
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : False
...
C order
मूल्यों आदेश है कि वे में उत्पन्न किया गया में हैं। स्थानांतरित वाले नहीं हैं
In [212]: x.reshape(12,) # same as x.ravel()
Out[212]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
In [213]: x.T.reshape(12,)
Out[213]: array([ 0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11])
आप दोनों के 1d विचार प्राप्त कर सकते हैं
In [214]: x1=x.T
In [217]: x.shape=(12,)
का आकार x
भी बदला जा सकता है।
In [220]: x1.shape=(12,)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-220-cf2b1a308253> in <module>()
----> 1 x1.shape=(12,)
AttributeError: incompatible shape for a non-contiguous array
लेकिन परिवर्तन का आकार नहीं बदला जा सकता है। data
में अब भी है 0,1,2,3,4...
आदेश है, जो के रूप में पहुँचा नहीं जा सकता तक पहुँचा 0,4,8...
एक 1d सरणी में।
लेकिन एक प्रति को x1
बदला जा सकता है:
In [227]: x2=x1.copy()
In [228]: x2.flags
Out[228]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
...
In [229]: x2.shape=(12,)
देखने से strides
भी मदद मिल सकती है। एक स्ट्राइड्स कितनी दूर (बाइट्स में) है इसे अगले मूल्य पर ले जाना है। 2d सरणी के लिए, 2 स्ट्राइड मान होंगे:
In [233]: x=np.arange(12).reshape(3,4).copy()
In [234]: x.strides
Out[234]: (16, 4)
अगली पंक्ति में जाने के लिए, चरण 16 बाइट्स, अगला स्तंभ केवल 4।
In [235]: x1.strides
Out[235]: (4, 16)
संक्रमण केवल स्ट्राइड्स के क्रम को स्विच करता है। अगली पंक्ति केवल 4 बाइट्स है- यानी अगली संख्या।
In [236]: x.shape=(12,)
In [237]: x.strides
Out[237]: (4,)
आकार बदलने से स्ट्राइड्स भी बदल जाता है - बस एक बार में बफर 4 बाइट्स के माध्यम से कदम।
In [238]: x2=x1.copy()
In [239]: x2.strides
Out[239]: (12, 4)
भले ही x2
जैसा दिखता है x1
, इसका एक अलग क्रम में मूल्यों के साथ, इसका अपना डेटा बफर है। अगला कॉलम अब 4 बाइट्स के ऊपर है, जबकि अगली पंक्ति 12 (3 * 4) है।
In [240]: x2.shape=(12,)
In [241]: x2.strides
Out[241]: (4,)
और जैसा है x
, आकार को 1d में बदलने से स्ट्राइड्स कम हो जाता है (4,)
।
के लिए x1
, में डेटा के साथ0,1,2,...
आदेश, वहाँ एक 1 दिन छलांग कि देना होगा नहीं है 0,4,8...
।
__array_interface__
सरणी जानकारी प्रदर्शित करने का एक और उपयोगी तरीका है:
In [242]: x1.__array_interface__
Out[242]:
{'strides': (4, 16),
'typestr': '<i4',
'shape': (4, 3),
'version': 3,
'data': (163336056, False),
'descr': [('', '<i4')]}
x1
डेटा बफर पते के लिए के रूप में ही किया जाएगाx
, जिसके साथ यह डेटा साझा करता है। x2
एक अलग बफर पता है।
तुम भी और आदेशों के order='F'
लिए एक पैरामीटर जोड़ने के साथ प्रयोग कर सकते हैं ।copy
reshape