基础 | 切片——神奇的用法

Python publisher01 45℃

写在前面:

PS:本文所有代码均在python3.6、ipython的环境下运行。

在Python中,像字符串(str)列表(list)元组(tupple)numpy ndarray等都支持切片操作。

同时,字符串、列表、元组的索引可以从正数的0开始从左向右(正序),也可以从负数的-1开始从右向左(逆序)。我们可以用代码检验一下:


索引

进入正题:

下面,我们先以列表来进行说明,元组、字符串也是类似的操作。

假设有一个列表:

alist = [0,1,2,3,4]

切片语法的基本形式:
alist[start:stop:step]

可以看出切片的操作有三个参数,分别是:

  • start:起始位置
  • stop:终止位置(不包括)
  • step:步长(默认为1)

这三个参数都是可选参数,表示索引index。

需要注意的是,切片的范围是[start,stop) (左闭右开)

step参数默认值是1。step不能为0,不然会报错ValueError。


不指定step:

当不指定step参数时,主要有下面几种形式:

1. alist[start:stop]
2. alist[start:]
3. alist[:stop]
4. alist[:]
  • 第一种方式:指定了start与stop参数,从start指定的下标开始取alist的元素,直到stop-1。

  • 第二种方式:会从start指定的下标开始,取alist剩余元素。

  • 第三种方式:会从alist的开始,取list元素,直到下标为stop-1。

  • 第四种方式:没有指定start与stop参数,则会返回整个列表


不指定step


start与stop参数为负值:

start与stop的值可以是负值,表示取值是从list的最后开始,而不是开头。前面我们也说过了,列表的索引可以是从负数-1开始,从右到左。

1. alist[-3]
2. alist[-2:]
3. alist[:-1]
4. alist[-4:-2]
  • 第一种方式:返回倒数第三个的值。

  • 第二种方式:指定参数start。

  • 第三种方式:指定参数stop。注意这里取不到stop,只能取到stop-1

  • 第四种方式:同时指定start和stop这两个参数。注意start的值需要小于stop的值。


参数start、stop为负数


参数step与参数start、stop一样,也具有正数、负数两种方式。step不能为0,不然会报错ValueError。)step为正数的情况比较好理解,所以只看step为负数的情况。

参数step为负数:
1. alist[::-2]
2. alist[4::-2]
3. alist[:2:-2]
4. alist[4:1:-2]
  • 第一种方式:未指定参数start和stop。

  • 第二种方式:指定参数start。

  • 第三种方式:指定参数stop。

  • 第四种方式:同时指定start和stop。因为step是负数,所以是逆序遍历列表,所以参数start需要比参数stop大。


参数step为负数


写在最后:

参考资料:


讲了这么多,切片有什么用呢?

  • 可以简化代码
  • 方便图像处理,例如将图像所有像素的红色通道值都置为0,可以不用拆分出通道再赋值,(根据Numpy索引)直接使用切片。
import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')# 打开某个图像
img[:,:,2]=0

最后,附上一张切片的形象图,希望帮助大家更好理解python中的切片操作。


切片的形象理解

如有错误或建议,欢迎指出。如有侵权,请联系作者删除!!!

转载请注明:Python量化投资 » 基础 | 切片——神奇的用法

喜欢 (0)or分享 (0)