3.3 索引与切片

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

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]        
#从第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))
>>>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])
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值