Numpy基础(三)
Numpy数组跟列表很像,那列表的索引和切片的方法在Numpy中是否会存在呢。答案是肯定的,因为设计者肯定会考虑使用者的使用惯性。如果是与使用习惯相反,那肯定是推广不起来的。因此,介绍一下Numpy的索引和切片
索引机制
Numpy数组索引机制指的是用方括号( [ ] )加序号的形式引用单个数组元素,它的用处很多,比如抽取元素,选取数组的几个元素,甚至为其赋一个新值。
一维数组
一维数组的索引很简单,从表面上看,它们跟Python的列表功能差不多
In [1]: import numpy as np
In [2]: arr = np.arange(10)
In [3]: arr
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [4]: arr[0]
Out[4]: 0
In [5]: arr[-1]
Out[5]: 9
In [6]: arr[4:6]
Out[6]: array([4, 5])
In [7]: arr[4:6] = 12
In [8]: arr
Out[8]: array([ 0, 1, 2, 3, 12, 12, 6, 7, 8, 9])
In [9]: arr[[1,3,4]]
Out[9]: array([ 1, 3, 12])
当一个标量赋值给一个切片时(如arr[4:6]),该值会自动广播到整个选区。
同时还可以传入多个索引值,同时选择多个元素(如arr[[1,3,4]])
二维数组
二维数组,它也被称为矩阵。矩阵是由行和列组成的矩形数组,行和列用两条轴来定义,其中轴0用行表示,轴1用列表示。因此,二维数组的索引用一对值来表示:第一个值为行索引,第二个值为列索引。所以,获取矩阵中的元素,依然使用方括号,但索引值为两个 [ 行索引,列索引 ]
In [11]: A = np.arange(1,10).reshape((3,3))
In [12]: A
Out[12]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
#获取第二行、第三列的元素
In [13]: A[1,2]
Out[13]: 6
切片操作
切片操作是指抽取数组的一部分元素生成新的数组。对Python列表进行切片操作得到的数组是原数组的副本,而Numpy数组得到的则是只想相同缓冲区的视图
Numpy的切片语法跟Python列表差不多
In [14]: arr
Out[14]: array([ 0, 1, 2, 3, 12, 12, 6, 7, 8, 9])
In [15]: arr[1:8:2]
Out[15]: array([ 1, 3, 12, 7])
In [16]: arr[::2]
Out[16]: array([ 0, 2, 12, 6, 8])
对于二维数组,切片的句法依然适用,只不过需要分别指定行和列的索引值。例只抽取第一行:
In [18]: A
Out[18]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [19]: A[0,:]
Out[19]: array([1, 2, 3])
上面代码中,第二个索引处只是用冒号,而没指定任意数字,这样选择的是所有的列。相反,如果想抽取第一列的所有元素,方括号中的两项应该交换位置
In [20]A[:,0]
Out[20]: array([1, 4, 7])
如果抽取一个小一点的矩阵,需要指定所有的轴的范围
In [21]: A[0:2,0:2]
Out[21]:
array([[1, 2],
[4, 5]])
如果抽取的行或列的索引不连续,可以把这几个索引放到数组中
In [22]: A[[0,2],0:2]
Out[22]:
array([[1, 2],
[7, 8]])
条件和布尔数组
到目前为止,已经尝试用过索引和切片方法从数组中选择一部分元素。这些方法使用数值形式的索引。另外一种是从数组中有选择性地选择元素的方法是使用条件表达式和布尔运算符。
假设现在想从0到1之间的随机数组成的4x4型矩阵中选择所有小于0.5的元素。
In [23]: B = np.random.random((4,4))
In [24]: B
Out[24]:
array([[0.18821734, 0.50621767, 0.85815383, 0.46587106],
[0.41792111, 0.41115943, 0.8378181 , 0.89764709],
[0.17843294, 0.63285458, 0.46703162, 0.17800413],
[0.01936153, 0.95380452, 0.17745336, 0.50568087]])
创建随机数矩阵之后,如果使用表达条件的运算符,比如这里的小于号,将会得到由布尔值组成的数组。对于原数组中满足条件的元素,布尔数组中处于同等位置(小于0.5的元素所处的位置)的元素为True
In [25]: B < 0.5
Out[25]:
array([[ True, False, False, True],
[ True, True, False, False],
[ True, False, True, True],
[ True, False, True, False]])
实际上,从数组中选取一部分元素时,隐式地用到了布尔数组。直接把条件表达式置于方括号中,也能抽取出所有小于0.5的元素,组成一个新的数组。
In [26]: B[B < 0.5]
Out[26]:
array([0.18821734, 0.46587106, 0.41792111, 0.41115943, 0.17843294,
0.46703162, 0.17800413, 0.01936153, 0.17745336])
上一篇: Numpy入门