2013-07-09 79 views
7

我想重新排列我的numpy数组的维数。以下代码可以工作,但速度太慢。numpy数组的重新排序

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] 

在此之后,我矢量化new_im:

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

这么说,我不需要new_im,我只需要去new_im_vec。有一个更好的方法吗? image_size大约是256.

+0

如果你使用的是Python2,你可以使用'xrange'而不是'range' – jh314

回答

10

退房rollaxis,围绕移动轴,让您重新排序阵列中的单个命令的功能。如果im具有形状I,J,K

rollaxis(im, 2) 

应与形状K,I,J返回的数组。

在此之后,您可以将您的阵列弄平,ravel对此是明确的功能。把这一切放在一起,你有一个很好的一行:

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

酷!有用。我需要做的另一件事是在第一维中进行镜像。交换一个[1,:,:]和一个[3,:,:]。有这个功能吗? –

+1

@Mohammad Moghimi,如果我正确理解你的问题,你可以使用flipud翻转关于水平轴的数组。一个[:: - 1,:,]应该也有效。 –

+2

+1可能是最好的选择。为了完整性,还有一个选择(我相信实际上被'np.rollaxis'调用)做'np.transpose(im,(2,0,1))'。顺便说一句,'np.rollaxis'或'np.transpose'返回原始数据的视图,但在该视图上调用flatten时,可能会触发副本。 – 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 

这应该快得多,因为swapaxes返回数组的视图,而不是复制元素。

当然,如果你想跳过new_im,你可以在一行中完成,但仍然只有flatten正在做任何复制。

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