最近在学深度学习时,碰到许多关于Numpy的知识点,边学边做点笔记,方便记忆。
此篇文章用来学习Numpy Transpose函数。
————————————————————————————————
array = np.arange(0, 24).reshape(2, 4, 3)
print(array)
得到一个三维矩阵:
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]]
array.shape = (2,4,3)
第一个参数表示此三维矩阵中存在2个二维矩阵;第二个、第三个参数表示其中二维矩阵为4行3列矩阵,故shape为(2,4,3),且三个参数顺序分别对应索引号(0,1,2),2的索引号对应0,4的索引号对应1,3的索引号对应2。
————————————————————————————————
进行transpose变形
b = array.transpose(1, 0, 2)
transpose中参数(1,0,2)表示对第一个索引号与第二个索引号对应数字进行交换,结合上述array的实际情况,array.shape变为(4,2,3),此shape参数表示新的三维矩阵b中存在4个二维矩阵;第二个、第三个参数表示其中二维矩阵为2行3列矩阵,得到以下矩阵。
[[[ 0 1 2]
[12 13 14]]
[[ 3 4 5]
[15 16 17]]
[[ 6 7 8]
[18 19 20]]
[[ 9 10 11]
[21 22 23]]]
新得到b矩阵从shape上来看,与推论一致,但究竟是怎么来的呢,请看下面推导。
————————————————————————————————
原先array矩阵如下,把其中每个元素索引号写出,见括号内。
(只写了第一块矩阵,第二块矩阵可以自己动手完成)
[[[ 0(0,0,0) 1(0,0,1) 2(0,0,2)]
[ 3(0,1,0) 4(0,1,1) 5(0,1,2)]
[ 6(0,2,0) 7(0,2,1) 8(0,2,2)]
[ 9(0,3,0) 10(0,3,1) 11(0,3,2)]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]]
transpose表面上是对矩阵shape的索引号进行相应变换,但实质上,它是对其中每个元素索引号进行相应变换,transpose(1,0,2),就是将每个元素第一个索引号与第二个索引号进行互换,可得变化后的元素对应索引号。
[[[ 0(0,0,0) 1(0,0,1) 2(0,0,2)]
[ 3(1,0,0) 4(1,0,1) 5(1,0,2)]
[ 6(2,0,0) 7(2,0,1) 8(2,0,2)]
[ 9(3,0,0) 10(3,0,1) 11(3,0,2)]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]]
然后,将数字放入现在索引号对应的正确位置。
[[[0(0,0,0) 1(0,0,1) 2(0,0,2)]
[12 13 14]]
[[3(1,0,0) 4(1,0,1) 5(1,0,2)]
[15 16 17]]
[[6(2,0,0) 7(2,0,1) 8(2,0,2)]
[18 19 20]]
[[ 9(3,0,0) 10(3,0,1) 11(3,0,2)]
[21 22 23]]]
这样就可以得到最终的正确答案。
二维矩阵的transpose更加简单,另外维度的transpose也是一样的原理。
转载请注明原处