重新排序numpy数组

Moh*_*imi 8 python 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]
Run Code Online (Sandbox Code Playgroud)

在此之后,我将new_im向量化:

new_im_vec = new_im.reshape(image_size**2 * 3)
Run Code Online (Sandbox Code Playgroud)

也就是说,我不需要new_im,我只需要访问new_im_vec.有一个更好的方法吗?image_size大约是256.

Kyl*_*own 11

检查rollaxis,这是一个移动轴的功能,允许您在一个命令中重新排序阵列.如果im有形状i,j,k

rollaxis(im, 2)
Run Code Online (Sandbox Code Playgroud)

应该返回一个形状为k,i,j的数组.

在此之后,你可以展平你的阵列,ravel是一个明确的功能为此目的.把这一切放在一起,你有一个很好的单线:

new_im_vec = ravel(rollaxis(im, 2))
Run Code Online (Sandbox Code Playgroud)

  • +1可能是最好的选择.为了完整性,还有一个选项(我相信实际上是由`np.rollaxis`调用的)做`np.transpose(im,(2,0,1))`.另外,`np.rollaxis`或`np.transpose`返回原始数据的视图,但在该视图上调用flatten时,可能会触发副本. (2认同)

Chr*_*ker 8

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
Run Code Online (Sandbox Code Playgroud)

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

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

new_im_vec = im.swapaxes(0,2).swapaxes(1,2).flatten()
Run Code Online (Sandbox Code Playgroud)