(一)列表切片
最近从github中下拉别人的python代码学习处理卷积神经网络模型,但是由于自己是个刚上手的小白,对python代码也不是特别熟悉,刚刚入门。在别人的代码中经常会看到列表切片和数组切片,有点混乱,所以就查阅网上各种资料并做了一下比较和总结。如有不对的地方还请各位路过的大神们多多指教。
1 列表索引:list[start : end : step]
(1)检索的时候,结束位置的索引所代表的值不包含在内;
(2)但是start/end位置为空时,表示起始值/结束值都包含在内;
(3) 不指定步长的时候默认步长值为1
(4)step表示索引方向>0为从左往右,<0为从右往左
my_list[:8:3]
[5, 1, 8]
>>> my_list[:8:2]
[5, 9, 2, 8]
my_list[6:]
[8, 7, 6]
1.1 正索引,step>0
*
正序索引的时候是从左到右进行检索,结束位置(end)的索引值不算在内。
```>>> my_list=[5,3,9,1,2,0,8,7,6]
>>> my_list[:3:1]
[5, 3, 9]
>>> my_list[3:8:2]
[1, 0, 7]
>>> my_list[4::2]
[2, 8, 6]
>>> my_list[4:]
[2, 0, 8, 7, 6]
1.2 正索引,step<0
按照起始位置从右往左检索,结束位置(end)索引值不算。start 的值要大于end的值。
>>>my_list=[5,3,9,1,2,0,8,7,6]
>>>my_list[5:1:-2]
[0, 1]
>>> my_list[5:1:-1]
[0, 2, 1, 9]
start 的值要小于end的值时返回为空列表
>>>my_list=[5,3,9,1,2,0,8,7,6]
>>>my_list[4:8:-1]
[]
1.3 负索引 step>0
Python解释器还使用负索引来标识相对于列表末尾的元素的位置。索引-1标识列表中最后一个元素,-2标识倒数第2个元素等等。
>>>my_list[-9:-3:2]
[5, 9, 2]
1.4 负索引 step<0
>>>my_list[:-4:-1]
[6, 7, 8]
1.5 正负索同时出现 step>0
>>> my_list[-6:6:2]
[1, 0]
1.6正负索引同时出现 step<0
>>> my_list[7:-8:-1]
[7, 8, 0, 2, 1, 9]
1.7 各种 [: : : ] 形式出现
>>>my_list[::1]
[5, 3, 9, 1, 2, 0, 8, 7, 6]
>>> my_list[::-1]
[6, 7, 8, 0, 2, 1, 9, 3, 5]
>>> my_list[:-5:-2]
[6, 8]
(二)数组切片(数组形式,若是一个大列表,可以np.array(list)转成数组)
刚开始接触的时候经常会把数组切片和列表切片弄混,定睛一看。两者的长相还是有点区别的。列表切片没有逗号 “ , ”。而数组切片是用逗号来分割各个维度。并且“:”表示各个维度内的切片,只有:表示取这个维度的全部值
2.1 一维数组
一维数组也就退化成列表的用法,可以向上回看列表切片索引的用法
2.2 二维数组
(1) x[m,n]是通过numpy库引用数组或矩阵中的某一段数据集的一种写法,
(2)m代表第m维,n代表m维中取第几段特征数据。
2.2.1 x[:,n]
x[:,n]表示在全部数组(维)中取第n个数据,直观来说,x[:,n]就是取所有集合的第n个数据.
import numpy as np
X=np.array([[5,7],[1,2],[7,8],[9,0],[34,56],[7,90],[23,29]])
print(X[:,0])
[ 5 1 7 9 34 7 23]
X=np.array([[5,7],[1,2],[7,8],[9,0],[34,56],[7,90],[23,29]])
print(X[:,1])
[ 7 2 8 0 56 90 29]
2.2.2 x[n,:]
x[n,:]表示在n个数组(维)中取全部数据,直观来说,x[n,:]就是取第n集合的所有数据.
import numpy as np
X=np.array([[5,7],[1,2],[7,8],[9,0],[34,56],[7,90],[23,29]])
print(X[0,:])
2.2.3 x[:,m:n]
x[:,m:n],即取所有数据集的第m到n-1列数据
import numpy as np
X=np.array([[5,7,9,0],[1,25,8,0],[7,8,5,2],[9,0,3,9],[3,4,5,6],[7,9,0,1],[2,3,2,9]])
print(X[:,1:3])
[[ 7 9]
[25 8]
[ 8 5]
[ 0 3]
[ 4 5]
[ 9 0]
[ 3 2]]
2.2.4X[m:n,:]
取二维数组中第m行到第n-1行所有列的数据
import numpy as np
X=np.array([[5,7,9,0],[1,25,8,0],[7,8,5,2],[9,0,3,9],[3,4,5,6],[7,9,0,1],[2,3,2,9]])
print(X[:2,:])
[[ 5 7 9 0]
[ 1 25 8 0]]
2.3三维数组 X [楼层,行,列]
import numpy as np
x=np.arange(120).reshape(4,5,6)
print(x)
[[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[ 12 13 14 15 16 17]
[ 18 19 20 21 22 23]
[ 24 25 26 27 28 29]]
[[ 30 31 32 33 34 35]
[ 36 37 38 39 40 41]
[ 42 43 44 45 46 47]
[ 48 49 50 51 52 53]
[ 54 55 56 57 58 59]]
[[ 60 61 62 63 64 65]
[ 66 67 68 69 70 71]
[ 72 73 74 75 76 77]
[ 78 79 80 81 82 83]
[ 84 85 86 87 88 89]]
[[ 90 91 92 93 94 95]
[ 96 97 98 99 100 101]
[102 103 104 105 106 107]
[108 109 110 111 112 113]
[114 115 116 117 118 119]]]
可以看成有四层楼,每层按5行6列来摆放椅子。
2.3.1 x[m ,n ,z]表示第一维取m,第二维取n,第三维取z
x[2,4,1]的执行结果为
import numpy as np
x=np.arange(120).reshape(4,5,6)
print(x[2,4,1])
85
2.3.2 x[:,m,n]表示第一维全取,第二维取m,第三维取n
import numpy as np
x=np.arange(120).reshape(4,5,6)
print(x[:,2,5])
[ 17 47 77 107]
2.3.3x[:,m:,n]表示第一维全取,第二维取m及之后的所有值,第三维取n
import numpy as np
x=np.arange(120).reshape(4,5,6)
print(x[:,1:,4])
[[ 10 16 22 28]
[ 40 46 52 58]
[ 70 76 82 88]
[100 106 112 118]]
2.3.4 x[:,m:,:n]表示第一维全取,第二维取m及之后的所有值,第三维取n之前的值
import numpy as np
x=np.arange(120).reshape(4,5,6)
print(x[:,2:,:3])
[[[ 12 13 14]
[ 18 19 20]
[ 24 25 26]]
[[ 42 43 44]
[ 48 49 50]
[ 54 55 56]]
[[ 72 73 74]
[ 78 79 80]
[ 84 85 86]]
[[102 103 104]
[108 109 110]
[114 115 116]]]
注:以上数组形式的切片方法,在矩阵中同样适用。但是,若要取某个准确的值时,比如说第一列,第二行这一准确值时,矩阵的话,最好用mat[1,2],而数组的话,既可以用array[1,2],也可以用array[1][2] 。
- List item