2014-04-25 8 views
5

में सरणी को ट्रांसफर करना मेरे पास 212 सरणी आकार (M*N,N) है जो वास्तव में M, N*N सरणी शामिल है। मैं एक वेक्टरीकृत फैशन में इन सभी तत्वों (N*N matrices) को स्थानांतरित करना चाहता हूं।एक सरणी

A before transposing: 
[[ 1 2 3] 
[ 4 5 6] 
[ 7 8 9] 
[10 11 12] 
[13 14 15] 
[16 17 18] 
[19 20 21] 
[22 23 24] 
[25 26 27]] 
A after transposing: 
[[ 1 4 7] 
[ 2 5 8] 
[ 3 6 9] 
[10 13 16] 
[11 14 17] 
[12 15 18] 
[19 22 25] 
[20 23 26] 
[21 24 27]] 

कौन सा मैं उम्मीद: उदाहरण के लिए,

import numpy as np 
A=np.arange(1,28).reshape((9,3)) 
print "A before transposing:\n", A 
for i in range(3): 
    A[i*3:(i+1)*3,:]=A[i*3:(i+1)*3,:].T 
print "A after transposing:\n", A 

इस कोड को निम्नलिखित उत्पादन उत्पन्न करता है। लेकिन मैं वेक्टरकृत संस्करण चाहता हूँ।

+0

_vectorized_ द्वारा प्रतिलिपि बनाई गई है, क्या आपका मतलब तीन 3x3 सूचियों की सूची है? – 0605002

+1

@ 605002, वेक्टरकृत द्वारा नहीं, मेरा मतलब है 'लूप्स' के बिना (numpy विधियों का उपयोग करके numpy arrays में हेरफेर करने के साथ) – Cupitor

उत्तर

8

यहां एक पंक्ति में ऐसा करने का एक बुरा तरीका है!

A.reshape((-1, 3, 3)).swapaxes(-1, 1).reshape(A.shape) 

चरण-दर-चरण। (3, 3, 3)

>>> A.reshape((-1, 3, 3)) 
array([[[ 1, 2, 3], 
     [ 4, 5, 6], 
     [ 7, 8, 9]], 

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

     [[19, 20, 21], 
     [22, 23, 24], 
     [25, 26, 27]]]) 

को नयी आकृति प्रदान फिर प्रत्येक उप सरणी

>>> A.reshape((-1, 3, 3)).swapaxes(-1, 1) 
array([[[ 1, 4, 7], 
     [ 2, 5, 8], 
     [ 3, 6, 9]], 

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

     [[19, 22, 25], 
     [20, 23, 26], 
     [21, 24, 27]]]) 

अंत में (9, 3) को नयी आकृति प्रदान पर एक पक्षांतरित की तरह आपरेशन swapaxes प्रदर्शन करते हैं।

>>> A.reshape((-1, 3, 3)).swapaxes(-1, 1).reshape(A.shape) 
array([[ 1, 4, 7], 
     [ 2, 5, 8], 
     [ 3, 6, 9], 
     [10, 13, 16], 
     [11, 14, 17], 
     [12, 15, 18], 
     [19, 22, 25], 
     [20, 23, 26], 
     [21, 24, 27]]) 
>>> 

मुझे लगता है कि किसी भी विधि के साथ, डेटा प्रतिलिपि बनाई जानी चाहिए कि जब कोई 2d प्रगति/आकार कि परिणाम उत्पन्न कर सकते हैं से:

array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
     18, 19, 20, 21, 22, 23, 24, 25, 26, 27]) 

(? है वहाँ) मेरी संस्करण में मुझे लगता है कि डेटा अंतिम reshape चरण

+0

क्या आप क्या हो रहा है पर एक टिप्पणी दे सकते हैं? धन्यवाद। – Cupitor

+0

मुझे लगता है कि यह मेरे से अधिक तेज़ होगा !!! –

+0

आपको बहुत बहुत धन्यवाद। – Cupitor

3
In [42]: x = np.arange(1,28).reshape((9,3)) 

In [43]: x 
Out[43]: 
array([[ 1, 2, 3], 
     [ 4, 5, 6], 
     [ 7, 8, 9], 
     [10, 11, 12], 
     [13, 14, 15], 
     [16, 17, 18], 
     [19, 20, 21], 
     [22, 23, 24], 
     [25, 26, 27]]) 


In [31]: r,c = x.shape 
In [39]: z = np.vstack(np.hsplit(x.T,r/c)) 

In [45]: z 
Out[45]: 
array([[ 1, 4, 7], 
     [ 2, 5, 8], 
     [ 3, 6, 9], 
     [10, 13, 16], 
     [11, 14, 17], 
     [12, 15, 18], 
     [19, 22, 25], 
     [20, 23, 26], 
     [21, 24, 27]])