np.transpose炒鸡详细的讲解,如果看本文之前你不懂,看完你绝对能懂,你值得拥有
一个电脑小白的自我成长之路*_&
np.transpose()函数是用来处理数组转置问题的
一维数组,通常我的理解就是和python中列表差不多,
li = [i for i in range(10)]
print(li) # 输出的结果是 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]`
二维数值,等同于矩阵。栗子如下:
arr2 = np.arange(12).reshape(3, 4)
print(arr2) # [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
np.arange(12)表示数值的数从0-11共12 个数,reshape(3,4)表示定义一个二维数值,行数是3列数为4,即3*4三行四列。用np.transpose()函数进行转置,行列转换后的结果为一个4行3列的结果,为:
tran_arr2 = np.transpose(arr2)
print(tran_arr2) # [[ 0 4 8]
# [ 1 5 9]
# [ 2 6 10]
# [ 3 7 11]]
原二维数组arr2的第一列的三个数0, 4, 8转换成了tran_arr2的第一行[0, 4, 8]。从矩阵层面理解的话trans_arr2也就是原数组arr的转置矩阵。
arr2[0, 0] = 0,中括号里可以理解为平面坐标位置[0 , 0] ,行理解为横坐标,列理解为纵坐标,即第一行第一列第一个数(为啥是第一行第一列,因为计算机是从0开始计数的),那arr2[2,3]是不是理解为位置是[2,3]的数,也就是第三行第四列的数,即11,看这样理解你就对啦。
二维数值的索引比较好理解,行是0,列是1.
#原数组
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
#转置后数组
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
三维数组,arr3[d, h, w]有三个维度分别为深,高,宽,[d, h, w]可以理解为空间三维坐标x, z ,y 栗子如下:
# arr3[0, 0, 0] = 0, arr3[0, 0, 1] = 1, arr3[0, 0, 2] = 2, arr3[0, 1, 0] = 3,
# arr3[0, 1, 1] = 4, arr3[0, 1, 2] = 5, arr3[1, 0, 0] = 6,arr3[1, 0, 1] = 7
# arr3[1, 0, 2] = 8, arr3[1, 1, 0] = 9, arr3[1, 1, 1] = 10,arr3[1, 0, 1] = 11
arr3 = np.arange(12).reshape(2, 2, 3)
for d in range(2):
for h in range(2):
for w in range(3):
print(arr3[d, h , w]) # d也就是三维第一个参数表示深度,h也是第二个参数表示高,
# w也是宽度第三个参数
print(arr3[1, 0, 0]) # 结果为6
循环打印的结果很明显就是0,1,2,3,4,5,6,7,8,9,10,11啦。arr3为223的三维数组。输出arr3 的结果如下:
arr3[1, 0, 0]表示的是深度为2,高为1,宽为1的数,即坐标位置为[1, 0, 0]的数就是6,如果你问arr3[0 , 1, 1],那就是4啦。
对着代码画个,空间坐标系然后就明白啦。
接着,就是理解一下索引啦,三维数组的索引d对应0,h对应1,w对应2。
即深度是2,索引号0;高度为2,索引号是1;宽度是3,索引号是2.
再来理解np.transpose()函数是怎么将三维数组转换的。
tran_arr3 = np.transpose(arr3, (1, 0, 2)) # 即深索引本身是0的数,用索引为1的高的数代替了,
# 高的索引本身是1,用索引为0 的深的数换了
print(tran_arr3) # [[[ 0 1 2]
# [ 6 7 8]]
# [[ 3 4 5]
# [ 9 10 11]]]
np.transpose(arr3, (1, 0 ,2))的意思就深和高对换,宽位置不变。即数组中arr3[0,1,0] =3 和arr3[1,0,0] = 6对换,arr3[0 ,1 ,1]为4的数和arr3[1, 0 ,1]为7的数对调,arr3[0, 1, 2]的数5和arr3[1, 0, 2]为8的数对换。所以,输出tran_arr3的结果如上面代码的结果。犹如深和高都是2,直接互换就可以啦。如果不一样,又该怎么样呢?如果深和宽互换,代码如下:
tran1_arr3 = np.transpose(arr3, (2, 1, 0))
print(tran1_arr3)
tran1_arr3 = np.transpose(arr3, (2, 1, 0)) 现在是深为2 ,宽为3进行互换,高不变。我们先猜猜结果,肯定是3*2**2的三维数组,即深度为3,高和宽是2的数组。结果到底怎么样呢?
#原数组,arr3
[[[ 0 1 2]
[ 3 4 5]]
[[ 6 7 8]
[ 9 10 11]]]
#arr[1, 0, 0]结果
6
# tran_arr3 = np.transpose(arr3, (1, 0, 2))深与高转换的数组,仍然是2*2*3的数组
[[[ 0 1 2]
[ 6 7 8]]
[[ 3 4 5]
[ 9 10 11]]]
# tran1_arr3 = np.transpose(arr3, (2, 1, 0)) 深与宽转换后的数组,变成3*2*3的数组了
[[[ 0 6]
[ 3 9]]
[[ 1 7]
[ 4 10]]
[[ 2 8]
[ 5 11]]]
具体的转换过程是这样的:
将其写成三维数组为:
####
[[[坐标为(000)的数0,坐标为(001)的数6]
[坐标为(010)的数3,坐标为(011)的数9]]
[[坐标为(100)的数1,坐标为(101)的数7]
[坐标为(110)的数4,坐标为(111)的数10]]
[[坐标为(200)的数2,坐标为(201)的数8]
[坐标为(210)的数5,坐标为(211)的数11]]]
即[ [[0,6]
[3,9]]
[[1,7]
[4,10]]
[[2,8]
[5,11]]]
够详细吗?按照我的思路,写一遍或者走一遍就能简单理解啦