其他关于Python的总结文章请访问://www.greatytc.com/nb/47435944
Python的list、tuple以及Numpy的数组中使用冒号、逗号进行索引的规则总结
Python 中常常要用到对序列进行索引,从而获取其中的某个元素或者某些元素,这个过程是使用中括号中的 索引坐标与冒号 搭配完成的,适用于一维或者多维的 list
、tuple
以及 numpy
中的 array
等数据类型
索引的一个基本规则
首先,序列的索引操作,在没有赋值操作的情况下都不会改动原来的数组:
a = [1,2,3,4,5]
print(a)
print(a[:])
print(a == a[:])
print(a is a[:])
------
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
True
False
冒号在Numpy数组索引中的作用
以下的表示方式仅在Numpy数组以及一维的list和tuple中适用
以一个 1×4 大小的一维数组和一个 2×3 大小的二维数组为例:
a=np.array([1,2,3,4])
b=np.array([[1,2,3],[4,5,6]])
-
表示全部选中
一个冒号就表示选中该区域全部元素,即原本该位置因该使用一个数字来表示唯一的索引从而确定唯一的元素位置,但是使用一个冒号则表示该位置不再是一个唯一的元素,而是该位置能表示的所有元素-
a[:]
表示a中的所有四个元素(1,2,3,4) -
b[0,:]
表示b中第一行的全部三个元素(1,2,3) -
b[1,:]
表示b中第二行的全部三个元素(4,5,6) -
b[:,0]
表示b中所有行(第一二行)的全部第一个元素(1和4) -
b[:,:]
表示b中所有行所有列的元素,也就是全部元素
-
-
表示区间
使用i:j
的形式来表示从索引i
到j
(不包含j
)的这个区间内的元素-
a[0:4]
表示a中从第0下标元素到第3下标元素的所有四个元素(1,2,3,4) -
a[1:3]
表示a中从第1下标元素到第2下标元素的元素(2和3) -
a[3:1]
由于第一个索引比第二个还大,所以返回空数组 -
b[0:2,1:3]
表示第一维度中取第0下标元素到第1下标元素(也就是第一行和第二行),第二维度中取第1下标元素到第2下标元素,所以最后的结果是[[2 3] [5 6]]
-
b[1:2,:]
与冒号第一种作用的混合使用,第一个冒号表示第1下标元素到第1下标元素区间,第二个冒号表示全部选中,也就是该行全选,所以最后的结果是[[4 5 6]]
-
-
表示区间与步长(步长方向)
使用i:j:k
的形式来表示从索引i
到j
(不包含j
)的这个区间内的元素,当k
为正整数时,表示每k
个取一次,当k
为负整数的时候,表示每k
个取一次,但是时倒着取
其中,i、j、k
三个位置的数字均可以省略:-
i
省略表示从第一个元素开始 -
j
省略表示最后一个元素结束 -
i
和j
同时省略则表示所有元素,也就不存在从小索引到大索引还是从大索引到小索引的区别了 -
k
省略表示步长为1,正向取值,但当k
值也省略的时候,第二个冒号也就没有必要写了,于是又回到了第二个使用i:j
表示区间的形式,其实刚才第二种形式就是k取1而忽略不写,再忽略第二个冒号的时候的特殊情况
-
一些具体的例子如下:
-
a[0:4:1]
表示a中从第0下标元素到第3下标元素的所有四个元素(1,2,3,4) -
a[0:4:2]
表示a中从第0下标元素到第3下标元素的这个区间内,每2个元素取一个,于是得到了 [1 3] -
a[0:4:3]
表示a中从第0下标元素到第3下标元素的这个区间内,每3个元素取一个,所以只会得到1这个元素,因为再往下第三个取的时候已经超出了区间上限 -
a[0:4:-1]
由于-1表示倒着取,所以没有取到,于是返回空数组 -
a[3:0:-1]
表示a中从第3下标元素到第1下标元素的这个区间内,每1个元素取一个,而且是倒着取的,于是得到了[4 3 2]
-
a[:4:1]
i 省略,表示从第一个元素到第3下标元素的这个区间,于是得到了[1 2 3 4]
-
a[2::1]
j 省略,表示从第2下标元素到最后一个元素,于是得到了[3 4]
-
a[1:3:]
和a[1:3]
是等同的,是忽略了k的情况,或者连同第二个冒号一起忽略,也就是k=1的情况,甚至简化为了只是用i:j
表示区间的形式 -
a[::2]
i 和 j 同时省略,表示所有元素,每2个元素取一个 -
a[::-1]
i 和 j 同时省略,表示所有元素,最后的k=-1表示倒着一个一个地取,这也就是把a逆序显示出来
以下针对Python中二维与多维的list和tuple
为什么上边所说的索引不适合Python中的二维及以上的list
和tuple
呢?因为list
和tuple
多维索引时是使用 [i][j]
的形式,而不是 Numpy
中的 [i,j]
的形式,两个的形式是有区别的
例如,一个Python中的二维list(tuple 同理)和一个内容完全一样的二维numpy数组:
a=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
b=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
由于Python的序列索引使用的是多个中括号构成的连续索引,所以每一个中括号中的索引都可以符合上边提到的冒号的三种用法,但是由于Python中的序列索引是没有使用逗号隔开多个维度索引这一语法的,于是看起来同样意义的写法导致的结果完全不同,如下所示,Python序列的两个(以及多个)连续的中括号是递进关系的,即先取出第一层中括号的内容,在进一步在去除的内容中取出第二个中括号的内容,以此类推,所以是无法直接同时返回多行、多列的数组元素的,同理的,中括号中出现逗号将报错,因为这种索引方式只存在于Numpy数组中:
print(a[:][1:4])
print(b[:,1:4])
print(a[:,1:4])
------
[[5, 6, 7, 8], [9, 10, 11, 12]]
[[ 2 3 4]
[ 6 7 8]
[10 11 12]]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-5597a9883bcf> in <module>
3 print(a[:][1:4])
4 print(b[:,1:4])
----> 5 print(a[:,1:4])
TypeError: list indices must be integers or slices, not tuple