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

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 测试图片

  下面显示

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)利用矩阵轴转换

下面几种方式可以获得相同的显示效果。显然使用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 -*-
#================&#

以上是关于numpy中的转置Transpose和.T以及轴对换swapaxis的主要内容,如果未能解决你的问题,请参考以下文章

数组的转置

数据分析从入门到“入坑“系列利用Python学习数据分析-Numpy中的数组转置和轴对称

04-numpy-笔记-transpose

numpy使用diagonal函数和sum函数计算矩阵的迹(trace)使用T函数对矩阵进行转置(transpose matrix)

SAS实验室之PROC TRANSPOSE

转置一维 NumPy 数组