美文网首页
3.3 索引与切片

3.3 索引与切片

作者: 操作系统 | 来源:发表于2017-03-19 09:13 被阅读0次

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

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])

相关文章

网友评论

      本文标题:3.3 索引与切片

      本文链接:https://www.haomeiwen.com/subject/topjnttx.html