NumPy - 高级索引

  • 简述

    可以从作为非元组序列的 ndarray、整数或布尔数据类型的 ndarray 对象或具有至少一项为序列对象的元组中进行选择。高级索引始终返回数据的副本。与此相反,切片仅呈现视图。
    有两种类型的高级索引 -IntegerBoolean.
  • 整数索引

    这种机制有助于根据数组的 N 维索引选择数组中的任意项。每个整数数组表示该维度的索引数。当索引由与目标 ndarray 的维度一样多的整数数组组成时,它就变得简单了。
    在以下示例中,从 ndarray 对象的每一行中选择指定列的一个元素。因此,行索引包含所有行号,列索引指定要选择的元素。

    示例 1

    
    import numpy as np 
    x = np.array([[1, 2], [3, 4], [5, 6]]) 
    y = x[[0,1,2], [0,1,0]] 
    print y
    
    它的输出如下 -
    
    [1  4  5]
    
    选择包括来自第一个数组的 (0,0)、(1,1) 和 (2,0) 处的元素。
    在以下示例中,选择了放置在 4X3 数组角上的元素。选择的行索引是 [0, 0] 和 [3,3],而列索引是 [0,2] 和 [0,2]。

    示例 2

    
    import numpy as np 
    x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 
       
    print 'Our array is:' 
    print x 
    print '\n' 
    rows = np.array([[0,0],[3,3]])
    cols = np.array([[0,2],[0,2]]) 
    y = x[rows,cols] 
       
    print 'The corner elements of this array are:' 
    print y
    
    该程序的输出如下 -
    
    Our array is:                                                                 
    [[ 0  1  2]                                                                   
     [ 3  4  5]                                                                   
     [ 6  7  8]                                                                   
     [ 9 10 11]]
     
    The corner elements of this array are:                                        
    [[ 0  2]                                                                      
     [ 9 11]] 
    
    结果选择是一个包含角元素的 ndarray 对象。
    高级索引和基本索引可以通过使用一个切片 (:) 或省略号 (...) 与索引数组进行组合。以下示例对行使用切片,对列使用高级索引。当 slice 用于两者时,结果是相同的。但是高级索引会导致复制,并且可能具有不同的内存布局。

    示例 3

    
    import numpy as np 
    x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 
    print 'Our array is:' 
    print x 
    print '\n'  
    # slicing 
    z = x[1:4,1:3] 
    print 'After slicing, our array becomes:' 
    print z 
    print '\n'  
    # using advanced index for column 
    y = x[1:4,[1,2]] 
    print 'Slicing using advanced index for column:' 
    print y
    
    该程序的输出如下 -
    
    Our array is:
    [[ 0  1  2] 
     [ 3  4  5] 
     [ 6  7  8]
     [ 9 10 11]]
     
    After slicing, our array becomes:
    [[ 4  5]
     [ 7  8]
     [10 11]]
    Slicing using advanced index for column:
    [[ 4  5]
     [ 7  8]
     [10 11]] 
    
  • 布尔数组索引

    当结果对象是布尔运算(例如比较运算符)的结果时,使用这种类型的高级索引。

    示例 1

    在此示例中,大于 5 的项目将作为布尔索引的结果返回。
    
    import numpy as np 
    x = np.array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]]) 
    print 'Our array is:' 
    print x 
    print '\n'  
    # Now we will print the items greater than 5 
    print 'The items greater than 5 are:' 
    print x[x > 5]
    
    该程序的输出将是 -
    
    Our array is: 
    [[ 0  1  2] 
     [ 3  4  5] 
     [ 6  7  8] 
     [ 9 10 11]] 
     
    The items greater than 5 are:
    [ 6  7  8  9 10 11] 
    

    示例 2

    在此示例中,使用 ~(补码运算符)省略了 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.] 
    

    示例 3

    以下示例显示如何从数组中过滤掉非复杂元素。
    
    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]