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
关键词
: 矩阵,轴交换
§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中的数组转置和轴对称
numpy使用diagonal函数和sum函数计算矩阵的迹(trace)使用T函数对矩阵进行转置(transpose matrix)