2013-07-09 23 views
7

Numpy dizilimimin boyutlarını yeniden sıralamak istiyorum. Aşağıdaki kod parçası çalışır, ancak çok yavaş. sözüSayısal dizilerin yeniden düzenlenmesi

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

, ben new_im gerek yoktur ve sadece new_im_vec almak gerekir:

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] 

Bundan sonra ben new_im vektörize. Bunu yapmanın daha iyi bir yolu var mı? image_size yaklaşık 256.

+0

, sen 'xrange' yerine kullanabilirsiniz' Serin – jh314

cevap

10

, tek komut dizinizi yeniden düzenlemek için izin etrafında eksenleri kaydırır bir fonksiyonu. im şekle sahipse i, j,

rollaxis(im, 2) 

şekil k, i, j ile bir dizi dönmelidir k.

Bundan sonra dizinizi düzleştirebilirsiniz, ravel bu amaç için net bir işlevdir. hep birlikte bu koyarak, güzel bir tek astarı vardır: Eğer Python2 kullanıyorsanız

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

range'! işe yarıyor. Yapmam gereken diğer şey, ilk boyutta aynalamak. bir [1,:,:] ve bir [3,:,:] değiştirin. Bunun için bir işlev var mı? –

+1

@Mohammad Moghimi, Sorunuzu doğru anlıyorsam, yatay eksenle ilgili diziyi çevirmek için flipud'u kullanabilirsiniz. [:: - 1,:,:] ayrıca çalışmalıdır. –

+2

+1 Muhtemelen en iyi seçenek. Tamlık için, 'np.transpose (im, (2, 0, 1)) 'yapmanın (aslında np.rollaxis' tarafından çağrıldığına inanıyorum) seçeneği de vardır. Bir not olarak, 'np.rollaxis' veya' np.transpose' orijinal verilerin görünümünü döndürür, ancak bu görünümde arama yaparken bir kopyanın tetiklenmesi olasıdır. – 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 

Bu swapaxes ziyade unsurları üzerinde kopyalamak yerine dizisinde bir görünüm verir, çünkü çok daha hızlı olmalıdır olduğunu.

Ve tabii ki new_im'u atlamak isterseniz, bunu bir satırda yapabilir ve hala yalnızca flatten hiçbir kopyalama işlemini gerçekleştirir. Kontrol dışarı rollaxis

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