其他分享
首页 > 其他分享> > numpy中的转置Transpose和.T以及轴对换swapaxis

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

作者:互联网

简 介: 本文对于 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中有两种矩阵轴交换的方法:

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矩阵的轴交换函数进行了测试。并对于深度学习中的图像数据进行处理。


■ 相关文献链接:

● 相关图表链接:

#!/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