ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

numpy中的转置Transpose和.T以及轴对换swapaxis

2021-12-15 21:33:57  阅读:171  来源: 互联网

标签:arr 转置 transpose 对换 Transpose 维度 swapaxes print imgdata


简 介: 本文对于 numpy中的转置Transpose和.T以及轴对换swapaxis 中关于numpy矩阵的轴交换函数进行了测试。并对于深度学习中的图像数据进行处理。 参考文章:https://blog.csdn.net/qq1483661204/article/details/70543952 标签:11,arr,转置,Transpose,对换,transpose,维度,swapaxes,print 来源: https://blog.csdn.net/u014157109/article/details/89787623

关键词 矩阵轴交换

矩阵轴交换 文章目录 为什么需要
交换矩阵?
两种轴交换方法 图像处理 10数据集合 显示图片 附 录

 

§01 阵轴交换


1.1 为什么需要交换矩阵?

  对于矩阵进行轴交换,在实际数据处理中非常有用处。比如对于彩色图像数据,它的数据排布结构往往是(H,W,3)。

1.1.1 显示彩色图片数据结构

img = cv2.imread(filename)
print(img)
print(img.shape)

▲ 图1.1 测试图片

▲ 图1.1 测试图片

  下面显示

d:\temp\TEMP0001\Picture\211215195054.JPG
[[[119  71  59]
  [119  71  59]
  [118  70  58]
  ...

  [160 215 212]
  [161 216 213]
  [162 217 214]]]
(327, 560, 3)

  在利用深度学习网络对于图片进行识别和预测的时候,往往需要图片的数据结构呈现:(C,W,H),也就是图片的R,G,B空间是分层的,这就需要对于图片的轴进行交换。

1.1.2 轴交换与轴内反转不同

  矩阵的轴交换,与同纬度内的数据交换,反转不同。

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *

a = array([[1,2,3],[4,5,6]])
print(a)

b = a[::-1]
c = a.T[::-1].T

print(b,c)

  下面显示了对于矩阵A的横轴,纵轴的维度内的反转。

[[1 2 3]
[4 5 6]]

[[4 5 6]
[1 2 3]]

[[3 2 1]
[6 5 4]]

  而矩阵a的轴(横轴、纵轴)之间的结果为:

[[1 4]
[2 5]
[3 6]]

1.2 两种轴交换方法

  在python中numpy中有两种矩阵轴交换的方法:

  • transpose()
  • swapaxes()

1.2.1 transpose

  这个函数如果括号内不带参数,和.T效果一样,见下面例子:

import numpy as np
 
arr=np.arange(16).reshape(2,2,4)
print('arr:')
print(arr)

print('arr.transpose:')
print(arr.transpose())

print('arr.transpose(2,1,0):')
print(arr.transpose(2,1,0))

print('arr.T:')
print(arr.T)
结果:
arr:
[[[ 0  1  2  3]
  [ 4  5  6  7]]

 [[ 8  9 10 11]
  [12 13 14 15]]]
arr.transpose:
[[[ 0  8]
  [ 4 12]]

 [[ 1  9]
  [ 5 13]]

 [[ 2 10]
  [ 6 14]]

 [[ 3 11]
  [ 7 15]]]
arr.transpose(2,1,0):
[[[ 0  8]
  [ 4 12]]

 [[ 1  9]
  [ 5 13]]

 [[ 2 10]
  [ 6 14]]

 [[ 3 11]
  [ 7 15]]]
arr.T:
[[[ 0  8]
  [ 4 12]]

 [[ 1  9]
  [ 5 13]]

 [[ 2 10]
  [ 6 14]]

 [[ 3 11]
  [ 7 15]]]

  从上面的例子中可以看出arr.transpose(), arr.T ,arr.transpose(2,1,0)的结果是相同的。现在我们详细看看transpose()带参数的情况,就会明白为什么arr.transpose(2,1,0)有这样的结果。
  首先因为arr这个数组有三个维度,三个维度的编号对应为(0,1,2),假如我们需要拿到arr的7这个元素,肯定需要些三个维度的值,7的第一个维度为0,第二个维度为1,第三个3,所以arr[0,1,3] = 7。

  再回到transpose()这个函数,它里面参数的顺序就是维度的顺序,比如transpose(2,1,0),就是把之前第三个维度转为第一个维度,之前的第二个维度不变,之前的第一个维度变为第三个维度,我们继续拿7这个值来说,之前的索引为[0,1,3],按照我们的转换方法,把之前的第三维度变为第一维度,之前的第一维度变为第三维度,那么现在7的索引就是(3,1,0)

  同理所有的数组内的数字都是这样变得,这就是transpose()内参数的变化。

1.2.2 swapaxis

  swapaxes接受一对轴编号,或者叫一对维度编号,里面只能是两个参数,且不分顺序。

import numpy as np
arr=np.arange(16).reshape(2,2,4)
print('arr:')
print(arr)

print('arr.swapaxes(1,2):')
print(arr.swapaxes(1,2))      

#print('arr.swapaxes(2,1):')
#print(arr.swapaxes(2,1))

print('arr.transpose(0,2,1):')
print(arr.transpose(0,2,1))
结果:
arr:
[[[ 0  1  2  3]
  [ 4  5  6  7]]

 [[ 8  9 10 11]
  [12 13 14 15]]]
arr.swapaxes(1,2):
[[[ 0  4]
  [ 1  5]
  [ 2  6]
  [ 3  7]]

 [[ 8 12]
  [ 9 13]
  [10 14]
  [11 15]]]
arr.swapaxes(2,1):
[[[ 0  4]
  [ 1  5]
  [ 2  6]
  [ 3  7]]

 [[ 8 12]
  [ 9 13]
  [10 14]
  [11 15]]]
arr.transpose(0,2,1):
[[[ 0  4]
  [ 1  5]
  [ 2  6]
  [ 3  7]]

 [[ 8 12]
  [ 9 13]
  [10 14]
  [11 15]]]

  从上面的例子可以看出arr.swapaxes(1,2),arr.swapaxes(2,1),arr.transpose(0,2,1)效果是等价的。

 

§02 像处理


  用上面的矩阵的轴交换可以方便进行对图像数据进行转换。从原来的RGB像素数据修改成RGB平面数据。

2.1 10数据集合

  在 AI Studio中的视觉数据集合 介绍了对于AI Studio中的Cifar10数据集合进行操作过程。

2.1.1 利用pickle打开Cifar数据文件

  利用pickle函数打开Cifar数据文件,

(1)下载Cifar10

train_dataset = paddle.vision.datasets.Cifar10(mode='train')
fromfile = '/home/aistudio/.cache/paddle/dataset/cifar/cifar-10-python.tar.gz'
destfile = '/home/aistudio/data/cifar.tar.gz'

shutil.copyfile(fromfile, destfile)

  将下载的Cifar10数据在data目录加压缩,最后形成文件:

filename = 'data/cifar-10-batches-py/data_batch_1'

(2)打开数据文件

filename = '/home/aistudio/data/cifar-10-batches-py/data_batch_1'

def unpickle(file):
    import _pickle as cPickle
    with open(file, 'rb') as f:
        dict = cPickle.load(f, encoding='bytes')

    return dict

d = unpickle(filename)

2.2 显示图片

(1)利用zip对图像进行转轴

if procarg[:1] == '、' or procarg[:1] == '#' or procarg[:1] == '/':

    tspsendwindowkey("BML CodeLab", "c", control=1)
    time.sleep(.5)

    if greatflag > 0:
        allstr = clipboard.paste()
        allstr = allstr.replace('\r', '')
        strall = ''.join([('\n> '+ s if len(s.strip('\n').strip()) > 0 else '<br>') for s in allstr.split('\n')])

        clipboard.copy(strall + '\n')
    print('\a')
    tspsendwindowkey(csdn_title, "v", control=1, noreturn=1)

    exit()

▲ 图2.2.1 CIfar10图片

▲ 图2.2.1 CIfar10图片

(2)利用矩阵轴转换

下面几种方式可以获得相同的显示效果。显然使用numpy矩阵轴交换,三维矩阵转置代码最简单。

 Ⅰ.方式1
imgdata = imgdata.T
plt.imshow(imgdata)
plt.show()
 Ⅱ.方式2
imgdata = imgdata.transpose(2,0,1)
print(imgdata.shape)
plt.imshow(imgdata)
plt.show()
 Ⅲ.方式3
imgdata = imgdata.swapaxes(0,2)
print(imgdata.shape)
plt.imshow(imgdata)
plt.show()
imgdata = imgdata.swapaxes(0,1)
print(imgdata.shape)
plt.imshow(imgdata)
plt.show()

 

  录 ※


  文对于 numpy中的转置Transpose和.T以及轴对换swapaxis 中关于numpy矩阵的轴交换函数进行了测试。并对于深度学习中的图像数据进行处理。

  • 参考文章:https://blog.csdn.net/qq1483661204/article/details/70543952
  • 标签:11,arr,转置,Transpose,对换,transpose,维度,swapaxes,print
  • 来源: https://blog.csdn.net/u014157109/article/details/89787623


■ 相关文献链接:

● 相关图表链接:

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST8.PY                     -- by Dr. ZhuoQing 2021-12-15
#
# Note:
#============================================================

from headm import *                 # =
import shutil

import paddle
import paddle.nn.functional as F
from paddle import nn
from paddle.metric import accuracy as acc

#------------------------------------------------------------
train_dataset = paddle.vision.datasets.Cifar10(mode='train')
fromfile = '/home/aistudio/.cache/paddle/dataset/cifar/cifar-10-python.tar.gz'
destfile = '/home/aistudio/data/cifar.tar.gz'

shutil.copyfile(fromfile, destfile)

#------------------------------------------------------------

filename = '/home/aistudio/data/cifar-10-batches-py/data_batch_1'

def unpickle(file):
    import _pickle as cPickle
    with open(file, 'rb') as f:
        dict = cPickle.load(f, encoding='bytes')

    return dict

d = unpickle(filename)

#------------------------------------------------------------
imgdata = d[b'data'][0]

printf(imgdata[0].shape)

#------------------------------------------------------------


imgdata = array(list(zip(imgdata[:1024],
              imgdata[1024:1024*2],
              imgdata[1024*2:]))).reshape(32,32,3)

plt.imshow(imgdata)
plt.show()

#------------------------------------------------------------

imgdata = imgdata.swapaxes(0,1)
printf(imgdata.shape)
plt.imshow(imgdata)
plt.show()


#------------------------------------------------------------
#        END OF FILE : TEST8.PY
#============================================================

标签:arr,转置,transpose,对换,Transpose,维度,swapaxes,print,imgdata
来源: https://blog.csdn.net/zhuoqingjoking97298/article/details/121960356

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有