我想重新排序我的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)
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)