NumPy - 排序、搜索和计数函数

  • 简述

    NumPy 中提供了各种与排序相关的功能。这些排序函数实现了不同的排序算法,每个算法的特点是执行速度、最坏情况下的性能、所需的工作空间和算法的稳定性。下表显示了三种排序算法的比较。
    种类 速度 最差的情况 工作空间 稳定的
    '快速排序' 1 O(n^2) 0 不稳定
    '合并排序' 2 O(n*log(n)) ~n/2 稳定
    '堆排序' 3 O(n*log(n)) 0 不稳定
  • numpy.sort()

    sort() 函数返回输入数组的排序副本。它具有以下参数 -
    
    numpy.sort(a, axis, kind, order)
    
    函数说明
    序号 参数及说明
    1
    a
    要排序的数组
    2
    axis
    要对数组进行排序的轴。如果没有,则数组被展平,在最后一个轴上排序
    3
    kind
    默认为快速排序
    4
    order
    如果数组包含字段,则要排序的字段顺序

    例子

    
    import numpy as np  
    a = np.array([[3,7],[9,1]]) 
    print 'Our array is:' 
    print a 
    print '\n'
    print 'Applying sort() function:' 
    print np.sort(a) 
    print '\n' 
      
    print 'Sort along axis 0:' 
    print np.sort(a, axis = 0) 
    print '\n'  
    # Order parameter in sort function 
    dt = np.dtype([('name', 'S10'),('age', int)]) 
    a = np.array([("raju",21),("anil",25),("ravi", 17), ("amar",27)], dtype = dt) 
    print 'Our array is:' 
    print a 
    print '\n'  
    print 'Order by name:' 
    print np.sort(a, order = 'name')
    
    它将产生以下输出 -
    
    Our array is:
    [[3 7]
     [9 1]]
    Applying sort() function:
    [[3 7]
     [1 9]]
    Sort along axis 0:
    [[3 1]
     [9 7]]
    Our array is:
    [('raju', 21) ('anil', 25) ('ravi', 17) ('amar', 27)]
    Order by name:
    [('amar', 27) ('anil', 25) ('raju', 21) ('ravi', 17)]
    
  • numpy.argsort()

    numpy.argsort()函数沿给定轴对输入数组执行间接排序,并使用指定类型的排序返回数据索引数组。该索引数组用于构造排序数组。

    例子

    
    import numpy as np 
    x = np.array([3, 1, 2]) 
    print 'Our array is:' 
    print x 
    print '\n'  
    print 'Applying argsort() to x:' 
    y = np.argsort(x) 
    print y 
    print '\n'  
    print 'Reconstruct original array in sorted order:' 
    print x[y] 
    print '\n'  
    print 'Reconstruct the original array using loop:' 
    for i in y: 
       print x[i],
    
    它将产生以下输出 -
    
    Our array is:
    [3 1 2]
    Applying argsort() to x:
    [1 2 0]
    Reconstruct original array in sorted order:
    [1 2 3]
    Reconstruct the original array using loop:
    1 2 3
    
  • numpy.lexsort()

    函数使用一系列键执行间接排序。这些键可以看作是电子表格中的一列。该函数返回一个索引数组,使用它可以获得排序的数据。请注意,最后一个键恰好是排序的主键。

    例子

    
    import numpy as np 
    nm = ('raju','anil','ravi','amar') 
    dv = ('f.y.', 's.y.', 's.y.', 'f.y.') 
    ind = np.lexsort((dv,nm)) 
    print 'Applying lexsort() function:' 
    print ind 
    print '\n'  
    print 'Use this index to get sorted data:' 
    print [nm[i] + ", " + dv[i] for i in ind] 
    
    它将产生以下输出 -
    
    Applying lexsort() function:
    [3 1 0 2]
    Use this index to get sorted data:
    ['amar, f.y.', 'anil, s.y.', 'raju, f.y.', 'ravi, s.y.']
    
    NumPy 模块有许多用于在数组内搜索的函数。可以使用查找最大值、最小值以及满足给定条件的元素的功能。
  • numpy.argmax() 和 numpy.argmin()

    这两个函数分别沿给定轴返回最大和最小元素的索引。

    例子

    
    import numpy as np 
    a = np.array([[30,40,70],[80,20,10],[50,90,60]]) 
    print 'Our array is:' 
    print a 
    print '\n' 
    print 'Applying argmax() function:' 
    print np.argmax(a) 
    print '\n'  
    print 'Index of maximum number in flattened array' 
    print a.flatten() 
    print '\n'  
    print 'Array containing indices of maximum along axis 0:' 
    maxindex = np.argmax(a, axis = 0) 
    print maxindex 
    print '\n'  
    print 'Array containing indices of maximum along axis 1:' 
    maxindex = np.argmax(a, axis = 1) 
    print maxindex 
    print '\n'  
    print 'Applying argmin() function:' 
    minindex = np.argmin(a) 
    print minindex 
    print '\n'  
       
    print 'Flattened array:' 
    print a.flatten()[minindex] 
    print '\n'  
    print 'Flattened array along axis 0:' 
    minindex = np.argmin(a, axis = 0) 
    print minindex
    print '\n'
    print 'Flattened array along axis 1:' 
    minindex = np.argmin(a, axis = 1) 
    print minindex
    
    它将产生以下输出 -
    
    Our array is:
    [[30 40 70]
     [80 20 10]
     [50 90 60]]
    Applying argmax() function:
    7
    Index of maximum number in flattened array
    [30 40 70 80 20 10 50 90 60]
    Array containing indices of maximum along axis 0:
    [1 2 0]
    Array containing indices of maximum along axis 1:
    [2 0 1]
    Applying argmin() function:
    5
    Flattened array:
    10
    Flattened array along axis 0:
    [0 1 1]
    Flattened array along axis 1:
    [0 2 0]
    
  • numpy.nonzero()

    numpy.nonzero()函数返回输入数组中非零元素的索引。

    例子

    
    import numpy as np 
    a = np.array([[30,40,0],[0,20,10],[50,0,60]]) 
    print 'Our array is:' 
    print a 
    print '\n'  
    print 'Applying nonzero() function:' 
    print np.nonzero (a)
    
    它将产生以下输出 -
    
    Our array is:
    [[30 40 0]
     [ 0 20 10]
     [50 0 60]]
    Applying nonzero() function:
    (array([0, 0, 1, 1, 2, 2]), array([0, 1, 1, 2, 0, 2]))
    
  • numpy.where()

    where() 函数返回输入数组中满足给定条件的元素的索引。

    例子

    
    import numpy as np 
    x = np.arange(9.).reshape(3, 3) 
    print 'Our array is:' 
    print x  
    print 'Indices of elements > 3' 
    y = np.where(x > 3) 
    print y  
    print 'Use these indices to get elements satisfying the condition' 
    print x[y]
    
    它将产生以下输出 -
    
    Our array is:
    [[ 0. 1. 2.]
     [ 3. 4. 5.]
     [ 6. 7. 8.]]
    Indices of elements > 3
    (array([1, 1, 2, 2, 2]), array([1, 2, 0, 1, 2]))
    Use these indices to get elements satisfying the condition
    [ 4. 5. 6. 7. 8.]
    
  • numpy.extract()

    extract()函数返回满足任何条件的元素。
    
    import numpy as np 
    x = np.arange(9.).reshape(3, 3) 
    print 'Our array is:' 
    print x  
    # define a condition 
    condition = np.mod(x,2) == 0 
    print 'Element-wise value of condition' 
    print condition  
    print 'Extract elements using condition' 
    print np.extract(condition, x)
    
    它将产生以下输出 -
    
    Our array is:
    [[ 0. 1. 2.]
     [ 3. 4. 5.]
     [ 6. 7. 8.]]
    Element-wise value of condition
    [[ True False True]
     [False True False]
     [ True False True]]
    Extract elements using condition
    [ 0. 2. 4. 6. 8.]