np.transpose
import numpy as np
a = np.arange(24).reshape(2, 3, 4)
print(a)
# 替换的是原来的位置形状
# [[[ 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("维度0的0部分", a[0])
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print("维度1的0部分", a[:, 0])
# [[0 1 2 3]
# [12 13 14 15]]
print("维度2的0部分", a[:, :, 0])
# [[ 0 4 8]
# [12 16 20]]
# 和原a比较加上思考可发现每个维度有其本身的位置
print(np.transpose(a, [0, 2, 1]))
# 其实就是维度0的位置形状不变,交换其每部分里面维度1和维度2的位置(形状)
# 如维度0 0部分的值[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]中交换维度1和维度2的位置,
# 等于维度0的0部分做转置,得到
# [[ 0 4 8]
# [ 1 5 9]
# [ 2 6 10]
# [ 3 7 11]]
# 维度0剩余部分同理,可得:
# [[[ 0 4 8]
# [ 1 5 9]
# [ 2 6 10]
# [ 3 7 11]]
#
# [[12 16 20]
# [13 17 21]
# [14 18 22]
# [15 19 23]]]
print(np.transpose(a, [2,1,0]))
# 取出维度2的0部分内容:[[0 4 8] [12 16 20]]将其放到维度0的位置
# [[0 4 8]
# [12 16 20]]
# 同时 1,0维度与原始顺序相比也变化了,同上面分析取出此时0位置的数据做转置
# 得到:
# [[ 0 12]
# [ 4 16]
# [ 8 20]]
# 取出维度2的1部分内容:[[1 5 9] [13 17 21]]将其放到维度0的位置
# [[1 5 9]
# [13 17 21]]
# 做转置:
# [[ 1 13]
# [ 5 17]
# [ 9 21]]
# 最终得到:
# [[[ 0 12]
# [ 4 16]
# [ 8 20]]
#
# [[ 1 13]
# [ 5 17]
# [ 9 21]]
#
# [[ 2 14]
# [ 6 18]
# [10 22]]
#
# [[ 3 15]
# [ 7 19]
# [11 23]]]
print(np.transpose(a, [2,0,1]))
# 这个和前面[2,1,0]的分析一样,只是少了转置的一步
# 可得:
# [[[ 0 4 8]
# [12 16 20]]
#
# [[ 1 5 9]
# [13 17 21]]
#
# [[ 2 6 10]
# [14 18 22]]
#
# [[ 3 7 11]
# [15 19 23]]]
# 总结下:
# 1. 从维度0的位置开始看,取出对应原维度的值放到对应位置(想象理解)
# 2. 如果后面的维度比起原维度顺序有变化,则需要继续按1步骤处理(三维时候剩下维度变化可直接理解为转置)
print(np.transpose(a, [1, 0, 2]))
# 同理,0,2顺序没有变化,将维度1的各部分放到维度0的位置,直接可得结果
# 可以思考下