索引或切片都是根据条件对数组的元素进行存取的方法,本节主要介绍一维和二维数组的元素索引、切片索引及花式索引。
3.3.1 元素索引
数组的元素索引方法和Python列表的索引方法相同,用整数作为下标可以获取数组中的某个元素,且索引初值从0开始计算,一维数组的索引示例代码:
>>>a = np.arange(10)
>>>a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>a[5]
5
对于二维数组,索引的第一个参数表示行号,第二个参数表示列号,如果只有一个参数,则表示取得整行数据,示例代码:
>>>b = np.random.randint(0,10,size=(5,5))
>>>b
array([[0, 1, 7, 8, 1],
[5, 3, 7, 9, 2],
[9, 4, 8, 4, 1],
[6, 5, 9, 5, 9],
[6, 5, 6, 1, 9]])
>>>b[3] #返回数组b中的第4行所有元素
array([6, 5, 9, 5, 9])
>>>b[3, 2] #取得第4行第3列的元素
9
3.3.2 切片索引
切片索引与Python列表的切片索引不同,通过切片获取的新的数组是原数组的一个视图,它与原数组共享同一块数据存储空间。对于一维数组a,a[3:5]表示用切片获取数组的一部分,包括a[3]但不包括a[5];a[:5]切片中省略开始下标,表示从a[0]开始;a[-1]下标中使用负数,表示从数组最后往前数。示例代码:
>>>a[3:5]
array([3, 4])
>>>a[:5]
array([0, 1, 2, 3, 4])
>>>a[:-1]
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
>>>b = a[3:7]
>>>b
array([3, 4, 5, 6])
>>>b[2] = -10
>>>a
array([0, 1, 2, 3, 4, -10, 6, 7, 8, 9])
>>>id(a)
1366555852848
>>>id(b)
1366555852848
注意,在以上的示例中,数组a通过切片产生新的数组b,由于b和a共享同一块数据存储空间,将数组b的第2个元素修改为-10后,数组a对应的元素也发生改变。通过Python自带的对象主码查询函数id(),也可以看出数组a和b代表同一个对象。
二维数组的切片索引,示例代码:
>>>c = np.arange(24).reshape((4, 6))
>>>c
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
>>>c[0:2, 1]
array([1, 7])
>>>c[1, : ] # 取第一行所有元素,等价于c[1]
array([ 6, 7, 8, 9, 10, 11])
>>>c[ :, 1] #取第二列所有元素
array([ 1, 7, 13, 19])
>>>c[:1]
array([[0, 1, 2, 3, 4, 5]])
3.3.3 花式索引
元素索引和切片索引都局限于连续区域的值,而花式索引可以选取特定区域的值。
一维数组的花式索引,示例代码
>>>a = np.arange(10)
>>>a[1:-1:2] #第3个参数表示步长,2表示隔一个元素取一个元素
>>>a[::-1] #省略切片的开始下标和结束下标,步长为-1,整个数组头尾颠倒
>>>a[5:1:-2] #步长为负数时,开始下标必须大于结束下标
二维数组的花式索引,示例代码:
>>>b = np.arange(30).reshape((5, 6))
>>>b
array([[ 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]])
>>>b[2::2,::2] #从第2行开始以步长2开始切片,读取从第0列开始步长为2的所有列的元素
array([[12, 14, 16],
[24, 26, 28]])
>>>b[[1, 4, 3, 2], [0, 3, 1, 2]] #选出的元素坐标为(1, 0),(4, 3),(3, 1),(2, 2)
array([ 6, 27, 19, 14])
>>>b[[1, 4, 3, 2]][:, [0, 3, 1, 2]] #按0、3、1、2列的顺序依次显示1、4、3、2行
array([[ 6, 9, 7, 8],
[24, 27, 25, 26],
[18, 21, 19, 20],
[12, 15, 13, 14]])
此外,ndarray对象也支持布尔索引,即返回表达式布尔值为真的元素的数组,示例代码:
>>>a = np.arange(10)
>>>a[a < 3] #取得小于3的所有元素
array([0, 1, 2])
网友评论