हो सकता है कि 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])
नहीं हैं तो आपको मिल सकता है।
In [214]: x1=x.T
In [217]: x.shape=(12,)
x
सी के आकार के 1 डी विचार एक भी बदला जा सकता है।
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...
ऑर्डर में है, जिसे 1 डी सरणी में 0,4,8...
के रूप में एक्सेस नहीं किया जा सकता है।
लेकिन 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
साथ के रूप में 1 दिन के लिए आकार को बदलने (4,)
को प्रगति कम कर देता है।
x1
के लिए, 0,1,2,...
क्रम में डेटा के साथ, 1 डी ट्राइड नहीं है जो 0,4,8...
देगा।
In [242]: x1.__array_interface__
Out[242]:
{'strides': (4, 16),
'typestr': '<i4',
'shape': (4, 3),
'version': 3,
'data': (163336056, False),
'descr': [('', '<i4')]}
x1
डेटा बफर पता x
, जिसके साथ यह डेटा के शेयरों के लिए के रूप में ही होगा:
__array_interface__
सरणी जानकारी प्रदर्शित करने का एक और उपयोगी तरीका है। x2
में एक अलग बफर पता है।
आप order='F'
पैरामीटर copy
और reshape
आदेशों को जोड़ने के साथ भी प्रयोग कर सकते हैं।
मुझे लगता है कि यह एक नोट के साथ उपयोगी होगा कि किसी भी क्रम में कौन सी अनुक्रमणिका एक दूसरे के बगल में है: 'सी' के लिए अंतिम सूचकांक और' एफ' के लिए पहली अनुक्रमणिका, या एनडी सरणी के लिए .. बाद में इंडेक्स बंद हैं 'सी' के लिए पहले की तुलना में एक दूसरे के लिए और इसके विपरीत। – gauteh