NumPy学习(4):数组索引

NumPy-数组索引

NumPy-切片和索引

  • ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样

索引

  • ndarray 数组可以基于 0 - n 的下标进行索引

    import numpy as np
     
    a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
    b = a[5] 
    print(b)
    
    # 输出
      5
    

切片

  • slice 函数进行切片

    • 切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。

    • 例子

      import numpy as np
       
      a = np.arange(10)
      s = slice(2,7,2)   # 从索引 2 开始到索引 7 停止,间隔为2
      print (a[s])
      
      # 输出
        [2  4  6]
      
  • 通过索引提取切片

    • 可以通过冒号分隔切片参数 start:stop:step 来进行切片操作

      import numpy as np
       
      a = np.arange(10)  
      b = a[2:7:2]   # 从索引 2 开始到索引 7 停止,间隔为 2
      print(b)
      
      # 输出
        [2  4  6]
      
    • 如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。

    • 如果为 [2:],表示从该索引开始以后的所有项都将被提取。

      import numpy as np
       
      a = np.arange(10)
      print(a[2:])
      
      # 输出
        [2  3  4  5  6  7  8  9]
      
    • 如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。

      import numpy as np
       
      a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
      print(a[2:5])
      
      # 输出
        [2  3  4]
      
    • 多维数组同样适用上述索引提取方法

      import numpy as np
       
      a = np.array([[1,2,3],[3,4,5],[4,5,6]])
      print(a)
      # 从某个索引处开始切割
      print('从数组索引 a[1:] 处开始切割')
      print(a[1:])
      
      # 输出
        [[1 2 3]
         [3 4 5]
         [4 5 6]]
        从数组索引 a[1:] 处开始切割
        [[3 4 5]
         [4 5 6]]
      
    • 切片还可以包括省略号 ,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。

      import numpy as np
       
      a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
      print (a[... , 1])   # 第2列元素
      print (a[1 , ...])   # 第2行元素
      print (a[..., 1:])  # 第2列及剩下的所有元素
      
      #  输出
        [2 4 5]
        [3 4 5]
        [[2 3]
         [4 5]
         [5 6]]
      

NumPy-高级索引

整数数组索引

  • 整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。

  • 例子

    • 获取数组中 (0,0),(1,1)(2,0) 位置处的元素。

      import numpy as np 
       
      x = np.array([[1,  2],  [3,  4],  [5,  6]]) 
      y = x[[0,1,2],  [0,1,0]]   #行索引分别为0,1,2 列索引分别为0,1,0
      print (y)
      
      # 输出
        [1  4  5]
      
    • 获取了 4X3 数组中的四个角的元素。 行索引是 [0,0][3,3],而列索引是 [0,2][0,2]

      import numpy as np 
       
      x = np.array([[0, 1, 2],[3, 4, 5],[6, 7, 8],[9, 10, 11]])  
      print ('我们的数组是:' )
      print (x)
      print ('\n')
      rows = np.array([[0,0],[3,3]]) # 行索引分别为0,0,3,3
      cols = np.array([[0,2],[0,2]]) # 列索引分别为0,2,0,2
      y = x[rows,cols]  
      print  ('这个数组的四个角元素是:')
      print (y)
      
      # 输出
        我们的数组是:
        [[ 0  1  2]
         [ 3  4  5]
         [ 6  7  8]
         [ 9 10 11]]
      
      
        这个数组的四个角元素是:
        [[ 0  2]
         [ 9 11]]
      
    • 可以借助切片 : 与索引数组组合。

      import numpy as np
       
      a = np.array([[1,2,3], [4,5,6],[7,8,9]])
      b = a[1:3, 1:3]		#行索引为1,2  列索引为1,2
      c = a[1:3,[1,2]]	#行索引为1,2  列索引为1,2
      d = a[...,1:]		#列索引为1,2
      print(b)
      print(c)
      print(d)
      
      # 输出
        [[5 6]
         [8 9]]
        [[5 6]
         [8 9]]
        [[2 3]
         [5 6]
         [8 9]]
      

布尔索引

  • 布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

  • 例子

    • 获取大于 5 的元素

      import numpy as np 
       
      x = np.array([[0, 1, 2],[3, 4, 5],[6, 7, 8],[9, 10, 11]])  
      print ('数组是:')
      print (x)
      print ('\n')
      # 打印出大于 5 的元素  
      print  ('大于 5 的元素是:')
      print (x[x > 5])
      
      # 输出
        数组是:
        [[ 0  1  2]
         [ 3  4  5]
         [ 6  7  8]
         [ 9  10 11]]
      
      
        大于 5 的元素是:
        [ 6  7  8  9  10  11]
      
    • 使用了 ~(取补运算符)来过滤 NaN

      import numpy as np 
       
      a = np.array([np.nan,  1,2,np.nan,3,4,5])  
      print (a[~np.isnan(a)])
      
      # 输出
        [ 1.  2.  3.  4.  5.]
      
    • 过滤掉非复数元素

      import numpy as np 
       
      a = np.array([1, 2+6j, 5, 3.5+5j])  
      print (a[np.iscomplex(a)])
      
      # 输出
        [2.0+6.j  3.5+5.j]
      

花式索引

  • 花式索引指的是利用整数数组进行索引。
    • 花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。
  • 对于使用一维整型数组作为索引
    • 如果目标是一维数组,那么索引的结果就是对应位置的元素
    • 如果目标是二维数组,那么就是对应下标的行。
一维数组
  • 一维数组只有一个轴 axis = 0,所以一维数组就在 axis = 0 这个轴上取值

  • 例子

    import numpy as np
    
    x = np.arange(9)
    print(x)
    # 一维数组读取指定下标对应的元素
    print("-------读取下标对应的元素-------")
    x2 = x[[0, 6]] # 使用花式索引
    print(x2) 
    
    print(x2[0])
    print(x2[1])
    
    # 输出
      [0 1 2 3 4 5 6 7 8]
      -------读取下标对应的元素-------
      [0 6]
      0
      6
    
二维数组
  • 传入顺序索引数组

    import numpy as np 
     
    x=np.arange(32).reshape((8,4))
    print(x)
    # 二维数组读取指定下标对应的行
    print("-------读取下标对应的行-------")
    print (x[[4,2,1,7]])
    
    # 输出
      [[ 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]]
      -------读取下标对应的行-------
      [[16 17 18 19]
       [ 8  9 10 11]
       [ 4  5  6  7]
       [28 29 30 31]]
    
  • 传入倒序索引数组

    import numpy as np 
     
    x=np.arange(32).reshape((8,4))
    print (x[[-4,-2,-1,-7]])
    
    # 输出
      [[16 17 18 19]
       [24 25 26 27]
       [28 29 30 31]
       [ 4  5  6  7]]
    
  • 传入多个索引数组(要使用 np.ix_)。np.ix_ 函数就是输入两个数组,产生笛卡尔积的映射关系。

    import numpy as np 
     
    x=np.arange(32).reshape((8,4))
    print (x[np.ix_([1,5,7,2],[0,3,1,2])])
    
    #索引分别为
      [1][0],[1][3],[1][1],[1][2]
      [5][0],[5][3],[5][1],[5][2]
      [7][0],[7][3],[7][1],[7][2]
      [2][0],[2][3],[2][1],[2][2]
    
    # 输出
      [[ 4  7  5  6]
       [20 23 21 22]
       [28 31 29 30]
       [ 8 11  9 10]]
    

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值