在NumPy中对4维数组进行转置

5

我有一个4D数组(Python),其中包含10000个图像,每个图像有5个通道。每个图像的大小为25 * 25,即4D数组的形状为10000 * 5 * 25 * 25。

我需要转置这些图像。最简单的方法是使用嵌套循环:

            for i in range(np.shape(img)[0]):
                for j in range(np.shape(img)[1]):
                    img[i, j, :, :] = np.transpose(img[i, j, :, :])

但我相信有更有效率的方法可以完成这个任务。你有任何想法吗?

谢谢!


这是 np.transpose(img, [0, 1, 3, 2])。我相信这在这里以前已经被问过了 :) - MB-F
对不起,我没有找到类似的问题。 - user_3.14
嗯...我只找到了这个:https://stackoverflow.com/q/41038976/3005167 但我必须承认它有点难找... - MB-F
作为进一步的信息:img[i, j, :, :] 等同于 img[i, j],因此您可以节省一些索引,这可能会提高代码的可读性。 - Jürg W. Spaak
1个回答

7

函数numpy.transpose足够通用,可以处理多维数组。默认情况下,它会颠倒维度的顺序。

但是,它还有一个可选的axis参数,用于显式指定重新排列维度的顺序。要交换4D数组中的最后两个维度(即转置图像堆叠),请使用以下代码:

np.transpose(x, [0, 1, 3, 2])

不需要循环,它可以直接作用于整个4D数组,并且非常高效。

以下是一些更多的示例:

np.transpose(x, [0, 1, 2, 3])  # leaves the array unchanged
np.transpose(x, [3, 2, 1, 0])  # same as np.transpose(x)
np.transpose(x, [0, 2, 1, 3])  # transpose a stack of images with channel in the last dim

看起来这种类型的问题还没有一个标准答案。或者至少我没有轻易地找到一个。希望这可以帮到你 :) - MB-F
1
在这种情况下,我们也可以使用 np.swapaxes(x, 2, 3) 来使代码更易读。 - Daniel F
没错,就是这样。个人而言,在大多数情况下我更喜欢使用“转置”。 - MB-F
该函数文档中有一个三维示例。 - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接