2015-11-10 6 views
5

मेरे पास संख्याओं की एक श्रृंखला है जिसका आकार 26*43264 है। मैं इसे आकार 208*208 की सरणी में बदलना चाहता हूं लेकिन 26*26 के हिस्सों में।सरणी को एक वर्ग सरणी में रीशेप करना पायथन

[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
[10,11,12,13,14,15,16,17,18,19]] 

हो जाता है कुछ की तरह:

[[0, 1, 2, 3, 4], 
[10,11,12,13,14], 
[ 5, 6, 7, 8, 9], 
[15,16,17,18,19]] 
+0

'43264 = 208 * 208' के बाद से आप अपनी सरणी को '26 * 208 * 208' के आकार में दोबारा बदल सकते हैं लेकिन' 208 * 208 * 26 * 26' – toine

+0

नहीं, क्या आप बस' np.reshape (सूची 'की तलाश में हैं , (4,5)) '? – SirParselot

+0

बस np.reshape (सूची, (4,5)) काम नहीं करता है क्योंकि यह डेटा को गलत तरीके से विभाजित करता है। – Chidwack

उत्तर

3

सवाल देगी इस तरह से पहले आ गया है। बल्कि खोज की तुलना में मैं जल्दी से एक numpy दृष्टिकोण

demonstate अपने नमूना सरणी बनाती हूँ:

In [473]: x=np.arange(20).reshape(2,10) 
In [474]: x 
Out[474]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]]) 

उपयोग आकृति बदलें 5

In [475]: x.reshape(2,2,5) 
Out[475]: 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9]], 

     [[10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]]) 

के ब्लॉक में विभाजित है और आयाम को पुन: व्यवस्थित करने के लिए स्थानांतरित उपयोग करने के लिए , और प्रभाव में उन पंक्तियों को पुन: व्यवस्थित करें

In [476]: x.reshape(2,2,5).transpose(1,0,2) 
Out[476]: 
array([[[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14]], 

     [[ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19]]]) 

और विपक्ष के लिए एक और आकार 1 2 आयामों

In [477]: x.reshape(2,2,5).transpose(1,0,2).reshape(4,5) 
Out[477]: 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19]]) 

तो x पहले से ही एक numpy सरणी है, इन स्थानांतरित olidate और नयी आकृति प्रदान संचालन सस्ते (समय वार) कर रहे हैं। यदि x वास्तव में नेस्टेड सूचियां थीं, तो सूची संचालन के साथ दूसरा समाधान तेज होगा, क्योंकि एक सुस्त सरणी बनाने के ऊपर है।

1

एक छोटी सी बदसूरत, लेकिन यहाँ छोटा सा उदाहरण है कि आप पूर्ण आकार एक के लिए संशोधित करने के लिए सक्षम होना चाहिए के लिए एक एक लाइनर है:

In [29]: from itertools import chain 

In [30]: np.array(list(chain(*[np.arange(20).reshape(4,5)[i::2] for i in xrange(2)]))) 
Out[30]: 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19]]) 

संपादित करें: यहां एक फ़ंक्शन में एक अधिक सामान्यीकृत संस्करण है। उलझन कोड, लेकिन फ़ंक्शन बस एक सरणी लेता है और कई सेगमेंट जिन्हें आप समाप्त करना चाहते हैं।

In [57]: def break_arr(arr, chunks): 
    ....:  to_take = arr.shape[1]/chunks 
    ....:  return np.array(list(chain(*[arr.take(xrange(x*to_take, x*to_take+to_take), axis=1) for x in xrange(chunks)]))) 
    ....: 

In [58]: arr = np.arange(40).reshape(4,10) 

In [59]: break_arr(arr, 5) 
Out[59]: 
array([[ 0, 1], 
     [10, 11], 
     [20, 21], 
     [30, 31], 
     [ 2, 3], 
     [12, 13], 
     [22, 23], 
     [32, 33], 
     [ 4, 5], 
     [14, 15], 
     [24, 25], 
     [34, 35], 
     [ 6, 7], 
     [16, 17], 
     [26, 27], 
     [36, 37], 
     [ 8, 9], 
     [18, 19], 
     [28, 29], 
     [38, 39]]) 

In [60]: break_arr(arr, 2) 
Out[60]: 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [20, 21, 22, 23, 24], 
     [30, 31, 32, 33, 34], 
     [ 5, 6, 7, 8, 9], 
     [15, 16, 17, 18, 19], 
     [25, 26, 27, 28, 29], 
     [35, 36, 37, 38, 39]]) 
+0

तो यह पूर्णांक की एक बड़ी सरणी के साथ काम करने के लिए कैसे अनुकूलित किया जाएगा? – Chidwack

+0

संपादन को इसे उपयोग करने में थोड़ा आसान बनाना चाहिए। –

+0

बिल्कुल सही! धन्यवाद – Chidwack

संबंधित मुद्दे