numpy 矩阵转置_Numpy中transpose()函数的可视化理解

f869f1ea6e2e5276220d8130fbfda089.png

一 引言

本文将探讨高维数组的坐标轴变换:转置。

在对Tensor处理时,经常会对高维数组进行坐标轴上的变换,即进行转置操作。

Numpy库中提供了转置函数 transepose()完成高维数组的转置,返回的是源数据的视图,不进行任何复制操作1。二维数组(即矩阵)的转换较好理解,但高维数组的转置则比较抽象。

首先看一个3维数组的小例子:

import numpy as np
t = np.arange(1,17).reshape(2, 2, 4)
print(t)

三维数组为:

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

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

使用转置函数:

t1 = t.transpose(1, 0, 2)
print(t1)

转置结果为:

[[[ 1  2  3  4]
  [ 9 10 11 12]]

 [[ 5  6  7  8]
  [13 14 15 16]]]

上述结果初看较难直观理解。下文采用图示的方法对该函数进行解释。

二 理解高维矩阵在Numpy中的表达

在上面的例子中,3维数组t的shape为(2, 2, 4),表示有 2个2X4的矩阵2,即:

矩阵1:

矩阵2:

三 高维数组在坐标系下的位置

三个维度(2, 2, 4)的index分别为0, 1, 2,即(2(第0维), 2(第1维), 4(第2维))。 如果建立如下坐标系:

26e1bf59a07f47687ff548e010fa6289.png
图1 标准坐标系

则可在该坐标系内可视化三维数组t:

479f519e9cf8b31cbc84f7d2c710446f.png
图2 标准坐标系下的三维数组t

图2中,数组中矩阵1和矩阵2在0轴上依次排列;两个矩阵的行向量分别(如矩阵1中[1,2,3,4]、[5,6,7,8])在1轴上依次排列。行向量按照在各自矩阵中的index在坐标轴上从小到大排列。

四 坐标轴交换

4.1 可视化理解

语句t1 = t.transpose(1, 0, 2)相当于把0轴1轴位置进行了交换,2轴位置没有变化。对比一下:t: (0, 1, 2)t1: (1, 0, 2).

调整方向后的坐标系如下图所示(注意0轴、1轴的位置):

a8a7d8ea199e4a0c0a251328a2647236.png
图3 交换0轴、1轴后的新坐标系

在该坐标系方向下,数组t的位置摆放可视化结果为:

996c086b0fb57d9042ce65caf0cfc054.png
图4 数组t在新坐标系下的摆放

注意:在图4中,数组t仍按(2, 2, 4)对应(0轴, 1轴, 2轴)的方向摆放。

这里再对比一下数组t根据坐标方向改变的视觉变化。将t在原坐标系和新坐标系下按照(0轴, 1轴, 2轴)顺序摆放:

2bd6780a1810a3d9f2b8e997775c559d.png
图5 数组t在前后坐标位置下的摆放对比

关键的一步:我们已经得到了数组在新坐标系下的摆放,现在将这种摆放原封不动地挪到原坐标系下,即得到了坐标轴变换后的新数组。如图6:

82d21e0677ae65cb63947c455e887f74.png
图6 新摆放在原坐标系下的视图

可以看出,在原坐标系下[坐标轴与图5(左)一致],新摆放的数组shape仍为(2, 2, 4),即包含2个2 X 4的矩阵。这两个矩阵在0轴上依次排列,分别为图6中绿色的cube和蓝色的cube。

绿色Cube为:

蓝色Cube为:

因此,t1

也即引言小例子中的:

[[[ 1  2  3  4]
  [ 9 10 11 12]]

 [[ 5  6  7  8]
  [13 14 15 16]]]

4.2 巩固练习

在上小节,我们交换了0轴与1轴。进一步地,考虑3个轴都发生变化的情况:

t2 = t.transpose(2, 0, 1)

新旧坐标系对比:t: (0, 1, 2)t1: (2, 0, 1).

9c99499f4e4b66b47d1f2b8a8ec3389b.png
图7 新旧坐标系对比

数组t在新坐标轴下的摆放:

ce563607c0fd0834305904e91b36d5ba.png
图8 数组t在新坐标轴下的摆放

前后摆放对比如图9:

c065835ba9088d55c201d51a516055f9.png
图9 数组t在前后坐标系下的摆放对比

将新的摆放位置放至原坐标系下[坐标轴与图9(左)一致]的可视化结果:

69aaf50623ad7dfa74e8961656c8d19a.png
图10 新摆放在原坐标系下的视图

可以看出,在原坐标系下,新摆放的数组shape仍为(4, 2, 2),即包含4个2 X 2的矩阵。这两个矩阵在0轴上依次排列,分别为图10中红色、蓝色、黄色、绿色的cube,分别为。

红色Cube:

蓝色Cube:

黄色Cube:

绿色Cube:

因此,t2

运行验证一下:

t2 = t.transpose(2, 0, 1)
print(t2)

结果为:

[[[ 1  5]
  [ 9 13]]

 [[ 2  6]
  [10 14]]

 [[ 3  7]
  [11 15]]

 [[ 4  8]
  [12 16]]]

五 小结

采用可视化方法分析了高维(以三维矩阵为例)的坐标轴变换过程,即转置操作。结合Numpy的transpose()方法进行了代码验证。

在深度学习框架TensorFlow中,tf.transpose()实现相同功能。

参考:
1. https://blog.csdn.net/christianashannon/article/details/79006811
2. https://www.jianshu.com/p/de2e3022cd84
3. https://blog.csdn.net/u012762410/article/details/78912667


声明:本文为原创文章,欢迎转载。转载时请注明出处:

观海云远:Numpy中transpose()函数的可视化理解​zhuanlan.zhihu.com
5ef7115acbd33718f1085ed0333431af.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值