2014-04-25 16 views
5

Ich habe ein 2D-Array von Form (M*N,N), die tatsächlich aus M, N*N Arrays besteht. Ich möchte alle diese Elemente (N*N Matrizen) vektorisiert transponieren. Als BeispielTransponieren von Arrays in einem Array

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 

Dieser Code erzeugt die folgende Ausgabe:

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]] 

Was ich erwarten. Aber ich möchte die vektorisierte Version.

+0

Mit _vectorized_, meinst du eine Liste von drei 3x3 Listen? – 0605002

+1

@ 605002, nein durch vektorisiert ich meine ohne 'for' Schleifen (mit manipulieren numpy Arrays mit numpy Methoden) – Cupitor

Antwort

8

Hier ist eine böse Art, es in einer Zeile zu tun!

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

Schritt für Schritt. Umformen zu (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]]]) 

Dann führt einen Transponierte artigen Betrieb swapaxes auf jeden Sub-Array

>>> 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]]]) 

schließlich (9, 3) umformen.

>>> 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]]) 
>>> 

Ich denke, dass mit jeder Methode, Daten kopiert werden müssen, da es keine 2d Fortschritte/Form, die das Ergebnis erzeugen kann aus:

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]) 

(? Ist) In meiner Version denke ich, Daten wird in den letzten Umformschritt kopiert

+0

Könnten Sie bitte einen Kommentar geben, was passiert? Vielen Dank. – Cupitor

+0

Ich denke, es wäre schneller als meins !!! –

+0

Vielen Dank. – 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]])