2024-05-23 22:49:04 发布
网友
我想重新排列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]
之后,我将新的im矢量化:
new_im_vec = new_im.reshape(image_size**2 * 3)
也就是说,我不需要新的东西,我只需要去新的东西。有更好的办法吗?图像大小约为256。
使用einops:
x = einops.rearrange(x, 'height width color -> color height width')
优点:
签出rollaxis,这是一个移动轴的函数,允许您在单个命令中重新排序数组。如果im具有形状i、j、k
im
rollaxis(im, 2)
应返回形状为k、i、j的数组。
在此之后,可以展平数组,ravel是一个用于此目的的clear函数。把这些放在一起,你有一个很好的一行:
new_im_vec = ravel(rollaxis(im, 2))
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
flatten
new_im_vec = im.swapaxes(0,2).swapaxes(1,2).flatten()
使用einops:
优点:
签出rollaxis,这是一个移动轴的函数,允许您在单个命令中重新排序数组。如果
im
具有形状i、j、k应返回形状为k、i、j的数组。
在此之后,可以展平数组,ravel是一个用于此目的的clear函数。把这些放在一起,你有一个很好的一行:
这应该快得多,因为swapaxes返回数组上的视图,而不是复制元素。
当然,如果您想跳过
new_im
,您可以在一行中完成,而且仍然只有flatten
在执行任何复制。相关问题 更多 >
编程相关推荐