np.transpose()转置函数

最近看代码的时候,老是出现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])
>>> 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

由上可见,对于一维数组而言,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]])
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

有以上可见,原数组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]]])
>>> 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

这是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
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

那么我们知道了旋转的矩阵结果,那么在深度学习中为什么要这么旋转图片矩阵,以及这样做的意义及效果又是什么,我们可以继续往下探讨。
在mnist数据集中,挑出一张照片进行不同的transpose变换,观察得到的图片的形状。
下面举一个例子,数据集为4张图片:
这里写图片描述
四张图片分别代表“0”、“0”、“4”、“8”
处理的代码为:

import numpy as np
from PIL import Image
import os
data = np.empty((4, 20, 20), dtype="uint8")
imgs = os.listdir("E:\Kerasmnist/train\some")
num = len(imgs)
for i in range(num):
    img = Image.open("E:\Kerasmnist/train\some/" + imgs[i])
    img.show()
    arr = np.asarray(img, dtype="uint8")
    data[i, :, :] = arr

convert=data.transpose(2,1,0)

for k in range(len(convert[0])):
       img2=Image.fromarray(convert[k])
       img2.show()
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

目前没发现有什么奇妙之处,这个问题先放在这里,过些日子再继续探讨吧,See you

>>> arr = np.arange(16).reshape((2, 2, 4))
>>> arr
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])
>>> arr.transpose((1,0,2))
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])
>>> arr.transpose((0,2,1))
array([[[ 0,  4],
        [ 1,  5],
        [ 2,  6],
        [ 3,  7]],

       [[ 8, 12],
        [ 9, 13],
        [10, 14],
        [11, 15]]])
>>>  arr.transpose((1,2,0))

  File "<pyshell#23>", line 2
    arr.transpose((1,2,0))
    ^
IndentationError: unexpected indent
>>> arr.transpose((1,2,0))
array([[[ 0,  8],
        [ 1,  9],
        [ 2, 10],
        [ 3, 11]],

       [[ 4, 12],
        [ 5, 13],
        [ 6, 14],
        [ 7, 15]]])
>>> 

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值