切片(slice)简单来说就是更高级的索引操作,可以通过切片操作得到任意目标值,其切片对象的类型是与 Python 层面的slice相同的对象,即序列型对象,如array,list, string, tuple等,下面的介绍中将以array为例,通过一维和二维数组的来讲解,更高维的与二维类似,其他对象也与array类似。通过概念和代码实例的结合更容易理解
在介绍切片内容之前,先来通过一张图了解序列对象的索引。
从图中可以看出包括正索引和负索引两部分,从左到右索引默认 0 开始,从右到左索引默认 -1 开始。
切片操作基本表达式:
object[start_index : end_index : step
切片操作会将按照给定的索引和步长,截取序列中由连续的对象组成的片段,单个索引返回值可以视为只含有一个对象的连续片段。
下面介绍中s表示开始索引,e表示结束索引,p表示步长,下标表示维度
import numpy as np
X=[1,2,3,4,5]
print(X[0])
1
# 表示取最后一个元素
print(X[-1])
print('**'*10)
# 取索引2-最后之间的元素(默认步长为1)
print(X[1:])
print('**'*10)
# 取索引0-(-1;即倒数第一个索引)之间元素
print(X[:-1])
print('**'*10)
# 取索引1-(-1;倒数第二个索引)之间的元素
print(X[1:-1])
#结果
5
********************
[2, 3, 4, 5]
********************
[1, 2, 3, 4]
********************
[2, 3, 4]
# 以步长2取索引0-4之间元素
print(X[0:4:2])
print('**'*10)
# 以步长2取索引1-最后之间的元素
print(X[1::2])
# 以步长-1区所有元素(即倒着取出所有元素)
print('**'*10)
print(X[::-1])
#结果
[1, 3]
********************
[2, 4]
********************
[5, 4, 3, 2, 1]
X [ n 0 , n 1 ] X[n_0,n_1] X[n0,n1]是通过 numpy 库引用二维数组中某一段数据集的一种写法。同样, X [ n 0 , n 1 , n 2 ] X[n_0,n_1,n_2] X[n0,n1,n2]表示取三维数组,取N维数组则有N个参数,N-1个逗号分隔。以二维数组为例:(s表示开始索引,e表示结束索引,p表示步长,下标表示维度)
import numpy as np
X = np.array([[0,1,2,3],[10,11,12,13],[20,21,22,23],[30,31,32,33]])
# X 是一个二维数组,维度为 0 ,1
# 第 0 层 [] 表示第 0 维;第 1 层 [] 表示第 1 维;
print(X)
print('**'*10)
# 结果
[[ 0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]]
********************
print(X[1,0])
print('**'*10)
10
********************
print(X[1:3,1:3])
print('**'*10)
[[11 12]
[21 22]]
********************
import numpy as np
X = np.array([[0,1,2,3],[10,11,12,13],[20,21,22,23],[30,31,32,33]])
# X[:n0,:n1] 表示第 0 维 取 第0 到 第n0 个元素 ,第 1 维取 第0 到 第n1 个元素
print(X[2:4,:4])
print('**'*10)
# X[:n0,:n1] 表示第 0 维 取 第0 到 第n0 个元素 ,第 1 维以步长2取 第0 到 第n1 个元素
print(X[:2,:2:2])
print('**'*10)
# X[:n0,:n1] 表示第 0 维 取 第0 到 第n0 个元素 ,第 1 维以步长-2取 第0 到 第n1 个元素
print(X[:2,:2:-2])
print('**'*10)
# X[:,:n1] 表示第 0 维 取 全部元素 ,第 1 维取 第0 到第n1 个元素
print(X[:,:2])
print('**'*10)
# X[:,0]) 表示第 0 维 取全部 元素 ,第 1 维以步长2取索引0-3之间的元素
print(X[:,0:3:2])
结果如下:
[[20 21 22 23]
[30 31 32 33]]
********************
[[ 0]
[10]]
********************
[[ 3]
[13]]
********************
[[ 0 1]
[10 11]
[20 21]
[30 31]]
********************
[[ 0 2]
[10 12]
[20 22]
[30 32]]
# 索引超出数据索引
print(X[0:2,5::])
print('**'*10)
# start的索引大于end索引
print(X[3:2,2::])
print('**'*10)
# 当start_index表示的实际位置在end_index的左边时,step为负数
print(X[1:3:-1])
print('**'*10)
# 当start_index表示的实际位置在end_index的右边时,step为正数
print(X[3:1:1])
# 结果
[]
********************
[]
********************
[]
********************
[]
更高维度的数据,跟二维的是类似的,只是要输入正确的维度即可。
参考文章
彻底搞懂Python切片操作
Python中numpy数组切片