2013-07-09 11 views
7

Chcę zmienić kolejność wymiarów mojej tablicy numpy. Poniższy fragment kodu działa, ale jest zbyt wolny.zmiana kolejności numpy tablic

for i in range(image_size): 
    for j in range(image_size): 
     for k in range(3): 
      new_im[k, i, j] = im[i, j, k] 

Po tym, ja wektorować się new_im:

new_im_vec = new_im.reshape(image_size**2 * 3) 

Powiedział, że nie potrzeba new_im a ja tylko potrzeba, aby dostać się new_im_vec. Czy jest lepszy sposób to zrobić? image_size to około 256.

+0

Jeśli używasz python2, można użyć 'xrange' zamiast' range' – jh314

Odpowiedz

10

Wyjazd rollaxis, funkcja, która przesuwa się wokół osi, co pozwala uporządkować swoją tablicę w jednym poleceniu. Jeśli im ma kształt i, j, k

rollaxis(im, 2) 

powinien zwracać tablicę z kształt K, I, J.

Po tym można spłaszczyć tablicę, ravel jest jasną funkcją do tego celu. Wyrażając to wszystko razem, masz ładny jedno-liner:

new_im_vec = ravel(rollaxis(im, 2)) 
+0

cool! to działa. Drugą rzeczą, którą muszę zrobić, to lustro w pierwszym wymiarze. zamień a [1,:,:] i a [3,:,:]. Czy jest w tym funkcja? –

+1

@Mohammad Moghimi, Jeśli dobrze rozumiem twoje pytanie, możesz użyć flipud, aby odwrócić tablicę wokół osi poziomej. a [:: - 1,:,:] również powinien działać. –

+2

+1 Prawdopodobnie najlepsza opcja. Dla kompletności istnieje również opcja (która, jak sądzę, jest określana przez 'np.rollaxis') wykonywania' np.transpose (im, (2, 0, 1)) '. Jak na marginesie, 'np.rollaxis' lub' np.transpose' zwraca widok oryginalnych danych, ale wywołanie spłaszczenia tego widoku prawdopodobnie spowoduje uruchomienie kopii. – Jaime

7
new_im = im.swapaxes(0,2).swapaxes(1,2) # First swap i and k, then i and j 
new_im_vec = new_im.flatten() # Vectorize 

To powinno być znacznie szybsze, ponieważ swapaxes zwraca widok na tablicy, zamiast kopiować elementy.

I oczywiście, jeśli chcesz pominąć new_im, możesz to zrobić w jednym wierszu i nadal tylko flatten wykonuje jakiekolwiek kopiowanie.

new_im_vec = im.swapaxes(0,2).swapaxes(1,2).flatten()