写在前面:
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。
需要注意的是,切片的范围是 (左闭右开)
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参数,则会返回
整个列表
。
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的值。
参数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大。
写在最后:
参考资料:
讲了这么多,切片有什么用呢?
- 可以简化代码
- 方便图像处理,例如将图像所有像素的红色通道值都置为0,可以不用拆分出通道再赋值,(根据Numpy索引)直接使用切片。
import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')# 打开某个图像
img[:,:,2]=0
最后,附上一张切片的形象图,希望帮助大家更好理解python中的切片操作。
切片的形象理解如有错误或建议,欢迎指出。如有侵权,请联系作者删除!!!
网友评论