np.transpose的作用及在图像操作中的使用

本文总结了np.transpose()的原理、参数和返回值,通过一维、二维、三维数组示例说明其操作。还探讨了在深度学习中对图片矩阵使用该函数旋转的意义及效果,如对图像执行特定操作可实现逆时针翻转90度,配合其他函数能实现不同角度翻转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看代码的时候,老是出现np.transpose()这个用法,但是对其中的原理还是不甚了解,今天就来总结一下,以及这个用法对图像的结果及效果。

这里写图片描述
参数 a:输入数组
axis: int类型的列表,这个参数是可选的。默认情况下,反转的输入数组的维度,当给定这个参数时,按照这个参数所定的值进行数组变换。
返回值 p:ndarray 返回转置过后的原数组的视图。

给大家举个例子。

  1. 对于一维数组:
>>> import numpy as np
>>> t=np.arange(4)
>>> t
array([0, 1, 2, 3])
>>> t.transpose()
array([0, 1, 2, 3])
>>> 

由上可见,对于一维数组而言,numpy.transpose()是不起作用的。

  1. 对于二位数组:
>>> two=np.arange(16).reshape(4,4)
>>> two
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> two.transpose()
array([[ 0,  4,  8, 12],
       [ 1,  5,  9, 13],
       [ 2,  6, 10, 14],
       [ 3,  7, 11, 15]])
>>> two.transpose(1,0)
array([[ 0,  4,  8, 12],
       [ 1,  5,  9, 13],
       [ 2,  6, 10, 14],
       [ 3,  7, 11, 15]])
  •  

有以上可见,原数组two的数组两个轴为(x,y),对应的下标为(0,1),np.transpose()传入的参数为(1,0),即将原数组的x,y轴互换。综上,对二维数组的transpose操作就是对原数组的转置操作。

  1. 对于三维数组:先看一个例子。
>>> three=np.arange(18).reshape(2,3,3)
>>> three
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]]])
>>> three.transpose()
array([[[ 0,  9],
        [ 3, 12],
        [ 6, 15]],

       [[ 1, 10],
        [ 4, 13],
        [ 7, 16]],

       [[ 2, 11],
        [ 5, 14],
        [ 8, 17]]])
>>> 

这是numpy.transpose()函数对three数组默认的操作,即将原数组的各个axis进行reverse一下,three原始axis排列为(0,1,2),那numpy.transpose()默认的参数为(2,1,0)得到转置后的数组的视图,不影响原数组的内容以及大小。
我们一步一步来分析这个过程:axis(0,1,2)———>axis(2,1,0) ,transpose后的数组相对于原数组来说,相当于交换了原数组的0轴和2轴。

#对原始three数组的下标写出来,如下:
A=[
       [ [ (0,0,0) , (0,0,1) , (0,0,2)],
       [ (0,1,0) , (0,1,1) , (0,1,2)],
       [ (0,2,0) , (0,2,1) , (0,2,2)]],

       [[ (1,0,0) , (1,0,1) , (1,0,2)],
        [ (1,1,0) , (1,1,1) , (1,1,2)],
        [ (1,2,0) , (1,2,1) , (1,2,2)]]
  ]

#接着把上述每个三元组的第一个数和第三个数进行交换,得到以下的数组

B=[[[ (0,0,0) , (1,0,0) , (2,0,0)],
  [ (0,1,0) , (1,1,0) , (2,1,0)],
  [ (0,2,0) , (1,2,0) , (2,2,0)]],

  [[ (0,0,1) , (1,0,1) , (2,0,1)],
  [ (0,1,1) , (1,1,1) , (2,1,1)],
  [ (0,2,1) , (1,2,1) , (2,2,1)]]]

#最后在原数组中把B对应的下标的元素,写到相应的位置
#对比看一下,这是原数组
[[[ 0,  1,  2],
  [ 3,  4,  5],
  [ 6,  7,  8]],

  [[ 9, 10, 11],
   [12, 13, 14],
   [15, 16, 17]]]
# 按照B的映射关系得到最终的数组。
C=[[[ 0,  9],
  [ 3,  12],
  [ 6,  15]],

  [[ 1, 10],
   [4, 13],
   [7, 16]]

   [[ 2, 11],
   [5, 14],
   [8, 17]]
]
# 最终的结果也就是数组C

那么我们知道了旋转的矩阵结果,那么在深度学习中为什么要这么旋转图片矩阵,以及这样做的意义及效果又是什么,我们可以继续往下探讨。
我们拿来一张图片

然后执行下面代码:

import cv2 as cv
import numpy as np


img = cv.imread('my.jpg')
cv.imshow('img',img)
#逆时针旋转90度
img = np.transpose(img, (1, 0, 2))
#顺时针旋转90度
# img = cv.flip(img, 1)
#顺时针旋转270度
# img = cv.flip(img, 1)
cv.namedWindow('img',cv.WINDOW_AUTOSIZE)
cv.imshow('img2',img)
cv.waitKey(0)
cv.destroyAllWindows()

可以看到结果:

对图像执行np.transpose(img, (1, 0, 2))操作,可以将图像逆时针翻转90度,在配合cv2.flip(img, 0 or 1),可以做到翻转270度或90度。

前面部分转自:https://blog.csdn.net/xiongchengluo1129/article/details/79017142

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值