3.3 索引与切片

来源:互联网 发布:nginx 访问不同目录 编辑:程序博客网 时间:2024/06/06 09:26

  索引或切片都是根据条件对数组的元素进行存取的方法,本节主要介绍一维和二维数组的元素索引、切片索引及花式索引。

3.3.1 元素索引

  数组的元素索引方法和Python列表的索引方法相同,用整数作为下标可以获取数组中的某个元素,且索引初值从0开始计算,一维数组的索引示例代码:

>>>a = np.arange(10)>>>aarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>>>a[5]5

  对于二维数组,索引的第一个参数表示行号,第二个参数表示列号,如果只有一个参数,则表示取得整行数据,示例代码:

>>>b = np.random.randint(0,10,size=(5,5))>>>barray([[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]>>>barray([3, 4, 5, 6])>>>b[2] = -10>>>aarray([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))>>>carray([[ 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]        #从第2个元素(1)开始遍历到最后(-1),第3个参数表示步长,2表示隔一个元素取一个元素array([1, 3, 5, 7])>>>a[::-1]        #省略切片的开始下标和结束下标,步长为-1,整个数组头尾颠倒array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])>>>a[5:1:-2]        #步长为负数时,开始下标必须大于结束下标array([5, 3])

  二维数组的花式索引,示例代码:

>>>b = np.arange(30).reshape((5, 6))>>>barray([[ 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])
原创粉丝点击