python切片操作

前言

  最近经常用到切片操作,经常搞混掉,每次用都要查一查,于是写下这个博文记录一下。
  下面我们以列表为例来介绍下Python的切片操作。
在这里插入图片描述

一.切片

  一个完整的切片表达式包含两个:,用于分割列表参数,写法如下:

list[start_index:end_index:step]
  • start_index:其实位置
  • end_index:结束位置
  • step:步进,为正数的时候表示从前向后,负数表示从后往前,决定了切片的方向,step参数可以省略,步进默认为1。

1.1.具体操作

1.1.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

1.1.2.输出全部元素

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]

1.1.3.start_index和end_index全为正的情况

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]

1.1.4.start_index和end_index全为负(-)索引的情况

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同样是从右往左取值。索引-28的右边。
[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]

1.1.5. start_index和end_index正(+)负(-)混合索引的情况

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同样决定了从左往右取值,因此结果为空。
[]

1.1.6.多层切片操作

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]

1.1.7.表达式切片

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[2+1:3*2:7%3])
[4, 5, 6]

  注意:以上介绍的切片操作,同样适用于多维矩阵切片,元组切片。

1.1.8.多维矩阵切片

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]]]])

  切片内容至此基本上介绍完了,欢迎各位大佬批评指正。

  • 13
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I松风水月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值