【问题标题】:transpose on 4-d array in numpy在 numpy 中转置 4-d 数组
【发布时间】:2017-08-07 12:41:01
【问题描述】:

我有一个 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])。不过,我敢肯定,这里之前已经有人问过这个问题:)
  • 对不起,我没有找到类似的问题。
  • hmm.. 我只能找到这个:stackoverflow.com/q/41038976/3005167 但我不得不承认它有点难找...
  • 作为进一步的信息:img[i ,j ,: ,: ] 相当于img[i ,j ],所以你可以节省一些索引,这可能会提高你代码的可读性

标签: python arrays numpy multidimensional-array transpose


【解决方案1】:

函数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

【讨论】:

  • 看起来这类问题还没有规范的答案。或者至少我不容易找到一个。希望这会有所帮助:)
  • 在这种情况下也可以使用np.swapaxes(x, 2, 3) 使其更具可读性。
  • 是的,没错。就个人而言,我更喜欢在大多数情况下使用transpose
  • 函数文档有3d示例。
猜你喜欢
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2015-11-23
  • 2019-03-29
  • 2018-04-19
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
相关资源
最近更新 更多