a.transpose(m,n,r)
的参考博客:python的numpy中的transpose函数功能分析
a.permute(m,n,r)
功能和a.transpose(m,n,r)
一样。故以下以a.transpose(m,n,r)
为例来讲解。
根据评论区指出,
a.permute(m,n,r)
是torch。
对于一维矩阵,该函数无效果。
对于二维矩阵,结果为原矩阵的转置。
对于三维矩阵则比较难理解,需要理清几个重要的概念。
首先是介绍维度的概念。
我们先生成一个ndarray。
b=np.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]]])
再使用print(b.shape)
,查看其原有维度为(2, 3, 4)
维度的默认排序是(0,1,2)
由于索引从0开始,所以b的元素的索引为:
# 维度的默认排序是 (0,1,2)
b=np.array([[[ 0, 1, 2,3], (0,0,0) (0,0,1) (0,0,2) (0,0,3)
[ 4,5,6,7], (0,1,0) (0,1,1) (0,1,2) (0,1,3)
[ 8,9, 10,11]], (0,2,0) (0,2,1) (0,2,2) (0,2,3)
[[12, 13, 14, 15], (1,0,0) (1,0,1) (1,0,2) (1,0,3)
[16, 17,18, 19], (1,1,0) (1,1,1) (1,1,2) (1,1,3)
[20, 21,22, 23]]]) (1,2,0) (1,2,1) (1,2,2) (1,2,3)
执行以下代码,进行维度变换
c=b.transpose(2,1,0)
执行c=b.transpose(2,1,0)
,维度的排序由默认的(0,1,2)
变为(2,1,0)
。
对应的shape由(2, 3, 4)
变为(4, 3, 2)
。
元素的索引变化成如下的结果。
# 维度变换表现为:元素索引的 第三个数 和 第一个数 交换位置
# b=np.array([[[ 0, 1, 2,3], (0,0,0) (1,0,0) (2,0,0) (3,0,0)
# [ 4,5,6,7], (0,1,0) (1,1,0) (2,1,0) (3,1,0)
# [ 8,9, 10,11]], (0,2,0) (1,2,0) (2,2,0) (3,2,0)
#
# [[12, 13, 14, 15], (0,0,1) (1,0,1) (2,0,1) (3,0,1)
# [16, 17,18, 19], (0,1,1) (1,1,1) (2,1,1) (3,1,1)
# [20, 21,22, 23]]]) (0,2,1) (1,2,1) (2,2,1) (3,2,1)
#
# 按索引重新排列得:
# [[[ 0 12] (0,0,0) (0,0,1)
# [ 4 16] (0,1,0) (0,1,1)
# [ 8 20]] (0,2,0) (0,2,1)
#
# [[ 1 13] (1,0,0) (1,0,1)
# [ 5 17] (1,1,0) (1,1,1)
# [ 9 21]] (1,2,0) (1,2,1)
#
# [[ 2 14] (2,0,0) (2,0,1)
# [ 6 18] (2,1,0) (2,1,1)
# [10 22]] (2,2,0) (2,2,1)
#
# [[ 3 15] (3,0,0) (3,0,1)
# [ 7 19] (3,1,0) (3,1,1)
# [11 23]]] (3,2,0) (3,2,1)