numpy数组的重新排序

2024-05-23 22:49:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我想重新排列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。


Tags: 代码inimagenumpynewforsizerange
3条回答

使用einops:

x = einops.rearrange(x, 'height width color -> color height width')

优点:

  • 您可以看到轴在输入中是如何排序的
  • 您可以看到轴在输出中的顺序
  • 您不需要考虑需要采取的步骤(例如,不需要记住轴的滚动方向)

签出rollaxis,这是一个移动轴的函数,允许您在单个命令中重新排序数组。如果im具有形状i、j、k

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_vec = im.swapaxes(0,2).swapaxes(1,2).flatten()

相关问题 更多 >