前提:
1 假设你已经清楚了python 的list切片操作(这里不过多介绍)。
2 假设你对tensor的维度有了很好的理解,如果没有可以看我之前的博文 tensor维度的理解
切片格式:list[start:stop:step]
直接例子演示:
#创建三维矩阵a
a = np.arange(18).reshape(2,3,3)
print(a)
#输出a:(便于观察重新格式化了输出)
[
[ [ 0 1 2],
[ 3 4 5],
[ 6 7 8] ],
[ [ 9 10 11],
[12 13 14],
[15 16 17] ]
]
第0维: 两个3X3的2维矩阵的方向
第1维: 每个0维下三个3X1的一维矩阵的方向
第2维: 每个3X1矩阵内的三个数值的方向
如果理解了维度的概念,开始进入正题:
print(a[:,1:3,:])
#解析一下a[:,1:3,:]:
#对矩阵a的0维进行 [:] 切片即全部获取该维度
#对矩阵a的1维进行 [1:3] 切片即只从第一项开始获取,获取3-1项。
#对矩阵a的2维进行 [:] 切片即全部获取该维度
输出:
[[[ 3 4 5]
[ 6 7 8]]
[[12 13 14]
[15 16 17]]]
解析:
因为0维全部获取,所以两个3X3的矩阵都会拿到。一维获取的是下标为1的项和下标为3-1的项,注意0维下的两个矩阵都会进行此操作,所以两个3X3矩阵变成了2X3矩阵(被切片)。3维获取的是全部项,所以2X3矩阵下面的数值并没有被切掉。
尝试更复杂的操作:
print(a[0:1,1:3,1:2])
输出:
[[[4]
[7]]]
逐步分解:
1 第0维获第零项得到:
[[ [ 0 1 2]
[ 3 4 5]
[ 6 7 8] ]]
2 第1维获取第一和第二项得到:
[[[ 3 4 5]
[ 6 7 8] ]]]
3 第2维获取第一项得到:
[[[ 4 ]
[ 7 ] ]]]
(非常简单)
另一种切片格式:list[num]
看例子:
print(a[:,:,0])
此时第2维的切片是一个值不是[:]形式,表示获取该维度的第num项,这里表示获取第2维的第0项
输出:
[[ 0 3 6]
[ 9 12 15]]
输出的结果少了一个维度。变成了2维。对比第一种切片方式,同样获取第2维的第0项:
print(a[:,:,0:1])
输出:
[[[ 0]
[ 3]
[ 6]]
[[ 9]
[12]
[15]]]
结果依然是三维的。
结论: list[num]形式的切片会引发降维
切片的两个例子:
反转矩阵:
print(a[::-1]) # 反转第0维 实质是从后面复制第0维
print(a[::-1, ::-1]) # 反转第0维和第1维
print(a[::-1, ::-1, ::-1]) # 反转第0,1,2维
切片赋值:
a[:,0,:] = -1
print(a)
输出:
[
[[-1, -1, -1],
[3,4,5],
[6,7,8]],
[-1,-1,-1],
[12,13,14],
[15,16,17]]
]
(完)