numpy中数组的数组型索引和布尔型索引

本文参考Indexing-arrays,在理解该文的基础上,本文列出了四维布尔型索引,可加深对布尔型索引的理解。

1.数组型索引

数组型索引的数组,其返回的是原始数据的副本,不是视图。

数组型索引取值必须是整数。索引中的每个值指示数组中使用哪个值代替索引。但索引值不能越界。

>>> x=np.arange(10,1,-1)
>>> x[np.array([0,3,-1,8])]
array([10,7,2,2])

>>> #一般来说,当使用数组型索引时,返回的是一个与数组型索引具有相同形状的数组。
>>> x[np.array([[1,1],[2,3]])]  
array([[9,9],
       [8,7]]) 

 

2.多维数组型索引

>>> y=np.arange(35).reshape(5,7)
>>> y[np.array([0,2,4]),np.array([0,1,2])]    #等价于y[[0,2,4],[0,1,2]]
array([0,15,30])

>>> #如果数组型索引不具有相同的形状,则尝试将它们广播到相同的形状。如:
>>> y[np.array([0,2,4]),1]    
array([1,15,29])
>>> y[np.array([0,2,4])]
array([[0, 1, 2, 3, 4, 5, 6],
      [14,15,16,17,18,19,20],
      [28,29,30,31,32,33,34]])

 

3.布尔型索引

与数组型索引相比,布尔型索引作为切片时具有不同的处理方式。

布尔型索引必须具有与被索引数组的初始维度相同的形状。 在最直截了当的情况下,布尔型索引与被索引的数组具有相同的形状。

>>> b=y>20
>>> b
array([[False,False,False,False,False,False,False],
       [False,False,False,False,False,False,False],
       [False,False,False,False,False,False,False],
       [ True, True, True, True, True, True, True],
       [ True, True, True, True, True, True, True]])
>>> y[b]     #它返回的是一个一维数组
array([21,22,23,24,25,26,27,28,29,30,31,32,33,34])    #和整数数组型索引的数组不同,布尔型数组返回的结果是一个一维数组。与数组型索引的数组一样,返回的结果是数据的副本,而不是使用切片的得到的视图。


>>> #如果y的维度大于b的维度,则返回的结果将会是多维的。如:
>>> b[:,5]
array([False,False,False,True,True])
>>> y[b[:,5]]
array([[21,22,23,24,25,26,27],
       [28,29,30,31,32,33,34]])

>>> x=np.arange(30).reshape(2,3,5)
>>> b=np.array([[True,True,False],[False,True,True]])
>>> x[b]
array([[0,1,2,3,4],
       [5,6,7,8,9],
       [20,21,22,23,24],
       [25,26,27,28,29]])

四维数组的布尔型索引如下:

>>> z=np.arange(120).reshape(2,3,4,5)
>>> b2=np.array([True,False])
>>> z[b2]
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],
         [30, 31, 32, 33, 34],
         [35, 36, 37, 38, 39]],
        [[40, 41, 42, 43, 44],
         [45, 46, 47, 48, 49],
         [50, 51, 52, 53, 54],
         [55, 56, 57, 58, 59]]]])
>>> b3=np.array([[True,False,True],[False,True,False]])
>>> z[b3]
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19]],
       [[40, 41, 42, 43, 44],
        [45, 46, 47, 48, 49],
        [50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59]],
       [[80, 81, 82, 83, 84],
        [85, 86, 87, 88, 89],
        [90, 91, 92, 93, 94],
        [95, 96, 97, 98, 99]]])
>>> b4=np.array([[[False,False,True,False],
              [False,False,True,False],
              [False,False,True,False]],
             [[False,False,True,False],
              [False,False,True,False],
              [False,False,True,False]]])
>>> z[b4]
array([[ 10,  11,  12,  13,  14],
       [ 30,  31,  32,  33,  34],
       [ 50,  51,  52,  53,  54],
       [ 70,  71,  72,  73,  74],
       [ 90,  91,  92,  93,  94],
       [110, 111, 112, 113, 114]])

 

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值