最近经常用到切片操作,经常搞混掉,每次用都要查一查,于是写下这个博文记录一下。
下面我们以列表为例来介绍下Python的切片操作。
一个完整的切片表达式包含两个:
,用于分割列表参数,写法如下:
list[start_index:end_index:step]
start_index
:其实位置end_index
:结束位置step
:步进,为正数的时候表示从前向后,负数表示从后往前,决定了切片的方向,step参数可以省略,步进默认为1。a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in range(len(a)):
print(a[i])
输出:相当于直接输出列表中的元素,根据索引输出。
1
2
3
4
5
6
7
8
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 从左向右
print(a[::])
print("****************************************************************")
print(a[:])
print("****************************************************************")
# 从右向左
print(a[::-1])
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
****************************************************************
[1, 2, 3, 4, 5, 6, 7, 8, 9]
****************************************************************
[9, 8, 7, 6, 5, 4, 3, 2, 1]
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print("原始列表:")
print(a)
print("****************************************************************")
print("step=1,从左往右取值,start_index=2到end_index=8同样表示从左往右取值。")
print(a[2:8])
print("****************************************************************")
print("step=-1,决定了从右往左取值,而start_index=2到end_index=8决定了从左往右取值,矛盾,所以为空。")
print(a[2:8:-1])
print("****************************************************************")
print("step=1,决定了从左往右取值,而start_index=8到end_index=2决定了从右往左取值,矛盾,所以为空。")
print(a[8:2])
print("****************************************************************")
print("step=1,表示从左往右取值,而start_index省略时,表示从端点开始,因此这里的端点是“起点”,即从“起点”值0开始一直取到end_index=8(该点不包括,左闭右开)。")
print(a[:8])
print("****************************************************************")
print("step=-1,从右往左取值,而start_index省略时,表示从端点开始,因此这里的端点是“终点”,即从“终点”值9开始一直取到end_index=6(该点不包括)。")
print(a[:6:-1])
print("****************************************************************")
print("step=1,从左往右取值,从start_index=8开始,一直取到“终点”值9。")
print(a[8:])
print("****************************************************************")
print("step=-1,从右往左取值,从start_index=8开始,一直取到“起点”0。")
print(a[8::-1])
输出:
原始列表:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
****************************************************************
step=1,从左往右取值,start_index=2到end_index=8同样表示从左往右取值。
[3, 4, 5, 6, 7, 8]
****************************************************************
step=-1,决定了从右往左取值,而start_index=2到end_index=8决定了从左往右取值,矛盾,所以为空。
[]
****************************************************************
step=1,决定了从左往右取值,而start_index=8到end_index=2决定了从右往左取值,矛盾,所以为空。
[]
****************************************************************
step=1,表示从左往右取值,而start_index省略时,表示从端点开始,因此这里的端点是“起点”,即从“起点”值0开始一直取到end_index=8(该点不包括,左闭右开)。
[1, 2, 3, 4, 5, 6, 7, 8]
****************************************************************
step=-1,从右往左取值,而start_index省略时,表示从端点开始,因此这里的端点是“终点”,即从“终点”值9开始一直取到end_index=6(该点不包括)。
[9, 8]
****************************************************************
step=1,从左往右取值,从start_index=8开始,一直取到“终点”值9。
[9]
****************************************************************
step=-1,从右往左取值,从start_index=8开始,一直取到“起点”0。
[9, 8, 7, 6, 5, 4, 3, 2, 1]
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print("原始列表:")
print(a)
print("****************************************************************")
print("step=1,从左往右取值,而start_index=-2到end_index=-8决定了从右往左取值,两者矛盾,所以为空,索引-2在-8的右边")
print(a[-2:-8])
print("****************************************************************")
print("step=-1,从右往左取值,start_index=-2到end_index=-8同样是从右往左取值。索引-2在8的右边。")
print(a[-2:-8:-1])
print("****************************************************************")
print("step=1,从左往右取值,而start_index=-8到end_index=-2同样是从左往右取值,索引-8在-2的左边")
print(a[-8:-2])
print("****************************************************************")
print("step=1,从左往右取值,从“起点”开始一直取到end_index=-8(该点不包括)。")
print(a[:-8])
print("****************************************************************")
print("step=-1,从右往左取值,从“终点”开始一直取到end_index=-6(该点不包括)。")
print(a[:-6:-1])
print("****************************************************************")
print("step=1,从左往右取值,从start_index=-8开始,一直取到“终点”。")
print(a[-8:])
print("****************************************************************")
print("step=-1,从右往左取值,从start_index=-8开始,一直取到“起点”。")
print(a[-8::-1])
输出:
原始列表:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
****************************************************************
step=1,从左往右取值,而start_index=-2到end_index=-8决定了从右往左取值,两者矛盾,所以为空,索引-2在-8的右边
[]
****************************************************************
step=-1,从右往左取值,start_index=-2到end_index=-8同样是从右往左取值。索引-2在8的右边。
[8, 7, 6, 5, 4, 3]
****************************************************************
step=1,从左往右取值,而start_index=-8到end_index=-2同样是从左往右取值,索引-8在-2的左边
[2, 3, 4, 5, 6, 7]
****************************************************************
step=1,从左往右取值,从“起点”开始一直取到end_index=-8(该点不包括)。
[1]
****************************************************************
step=-1,从右往左取值,从“终点”开始一直取到end_index=-6(该点不包括)。
[9, 8, 7, 6, 5]
****************************************************************
step=1,从左往右取值,从start_index=-8开始,一直取到“终点”。
[2, 3, 4, 5, 6, 7, 8, 9]
****************************************************************
step=-1,从右往左取值,从start_index=-8开始,一直取到“起点”。
[2, 1]
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print("原始列表:")
print(a)
print("****************************************************************")
print("start_index=2在end_index=-2的左边,因此从左往右取值,而step=1同样决定了从左往右取值,因此结果正确。")
print(a[2:-2])
print("****************************************************************")
print("step=-1,决定了从右往左取值,而start_index=2到end_index=8决定了从左往右取值,矛盾,所以为空。")
print(a[2:-2:-1])
print("****************************************************************")
print("step=1,决定了从左往右取值,而start_index=8到end_index=2决定了从右往左取值,矛盾,所以为空。")
print(a[-1:6])
print("****************************************************************")
print("step=-1,从右往左取值,而start_index省略时,表示从端点开始,因此这里的端点是“终点”,即从“终点”值9开始一直取到end_index=6(该点不包括)。")
print(a[-1:6:-1])
print("****************************************************************")
print("start_index=2和end_index=-8处于同一位置,因此从左往右取值,而step=1同样决定了从左往右取值,因此结果为空。")
print(a[2:-8])
输出:
原始列表:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
****************************************************************
start_index=2在end_index=-2的左边,因此从左往右取值,而step=1同样决定了从左往右取值,因此结果正确。
[3, 4, 5, 6, 7]
****************************************************************
step=-1,决定了从右往左取值,而start_index=2到end_index=8决定了从左往右取值,矛盾,所以为空。
[]
****************************************************************
step=1,决定了从左往右取值,而start_index=8到end_index=2决定了从右往左取值,矛盾,所以为空。
[]
****************************************************************
step=-1,从右往左取值,而start_index省略时,表示从端点开始,因此这里的端点是“终点”,即从“终点”值9开始一直取到end_index=6(该点不包括)。
[9, 8]
****************************************************************
start_index=2和end_index=-8处于同一位置,因此从左往右取值,而step=1同样决定了从左往右取值,因此结果为空。
[]
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[:8][2:5][-1:])
print("****************************************************************")
# 等价于
b = a[:8]
c = b[2:5]
d = c[-1:]
print(d)
[5]
****************************************************************
[5]
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[2+1:3*2:7%3])
[4, 5, 6]
注意:以上介绍的切片操作,同样适用于多维矩阵切片,元组切片。
import torch
# 下面以一张随机生成的图像为例介绍下多维矩阵切片。
a = torch.rand(1, 3, 3, 3)
print("****************************************************************")
print("原始矩阵:")
print(a)
print("****************************************************************")
print(a.shape)
print("****************************************************************")
# 输出所有行和列
print(a[:, :, :])
print("****************************************************************")
# 输出所有batch,第一二行,第一列,第一二通道。每个分号前面的“:”都可以看成前面的列表处理就好理解了
print(a[:,0:2, 0:1, 0:2])
输出:
****************************************************************
原始矩阵:
tensor([[[[0.5726, 0.7904, 0.4065],
[0.6690, 0.1860, 0.2867],
[0.9059, 0.9977, 0.8525]],
[[0.3223, 0.3292, 0.7774],
[0.8210, 0.0859, 0.5072],
[0.2116, 0.1228, 0.9908]],
[[0.7774, 0.3815, 0.3958],
[0.9474, 0.5867, 0.2922],
[0.3193, 0.3581, 0.4624]]]])
****************************************************************
torch.Size([1, 3, 3, 3])
****************************************************************
tensor([[[[0.5726, 0.7904, 0.4065],
[0.6690, 0.1860, 0.2867],
[0.9059, 0.9977, 0.8525]],
[[0.3223, 0.3292, 0.7774],
[0.8210, 0.0859, 0.5072],
[0.2116, 0.1228, 0.9908]],
[[0.7774, 0.3815, 0.3958],
[0.9474, 0.5867, 0.2922],
[0.3193, 0.3581, 0.4624]]]])
****************************************************************
tensor([[[[0.5726, 0.7904]],
[[0.3223, 0.3292]]]])
切片内容至此基本上介绍完了,欢迎各位大佬批评指正。