2013-01-23 27 views
25

rozważyć szereg następującej postaci (tylko przykład):Zmiana kształtu tablicy w NumPy

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

To kształt [9,2]. Teraz chcemy przekształcić ten układ tak, że każda kolumna się kształt [3,3] w następujący sposób:

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

Najbardziej oczywiste (i zapewne „nie pythonic”), roztwór do zainicjowania tablicę zer z odpowiednim wymiarem i uruchom dwie pętle for, w których zostaną wypełnione danymi. Jestem zainteresowany rozwiązanie, które jest zgodne z języka ...

Odpowiedz

40
a = np.arange(18).reshape(9,2) 
b = a.reshape(3,3,2).swapaxes(0,2) 

# a: 
array([[ 0, 1], 
     [ 2, 3], 
     [ 4, 5], 
     [ 6, 7], 
     [ 8, 9], 
     [10, 11], 
     [12, 13], 
     [14, 15], 
     [16, 17]]) 


# b: 
array([[[ 0, 6, 12], 
     [ 2, 8, 14], 
     [ 4, 10, 16]], 

     [[ 1, 7, 13], 
     [ 3, 9, 15], 
     [ 5, 11, 17]]]) 
+15

Zauważ, że 'B' teraz nie jest jednolity, co oznacza, że ​​nie mogą być przekształcone w lokalu:' b.reshape (9, 2) ' zwraca kopię, a nie widok tych samych danych, a 'b.shape = (9, 2)' podniesie i wyświetli błąd. – Jaime

+3

Bardzo ważny komentarz autorstwa @Jaime, ponieważ punktem kształtu jest optymistyczne zmienianie rozmiaru bez klona. Dużo do czynienia z ogromnymi zbiorami danych – deepelement