zoukankan      html  css  js  c++  java
  • NumPy 排序、查找、计数


    章节


    NumPy中提供了各种排序相关的函数。这些排序函数实现了不同的排序算法,每个算法的特点是执行速度、最坏情况性能、所需的工作空间和算法的稳定性。下表为三种排序算法的比较。

    种类 速度 最差情况 工作区 稳定性
    ‘quicksort’ 1 O(n^2) 0 no
    ‘mergesort’ 2 O(n*log(n)) ~n/2 yes
    ‘heapsort’ 3 O(n*log(n)) 0 no

    numpy.sort()

    sort()对数组进行排序,返回排好序的数组副本。可以指定轴方向。

    函数语法:

    numpy.sort(a, axis, kind, order)
    

    参数

    • a 待排序数组
    • axis 指定排序的轴。如果没有,按最后一个轴排序。
    • kind 默认是‘quicksort’
    • order 指定排序字段

    示例

    import numpy as np  
    a = np.array([[3,7],[9,1]]) 
    
    print ('数组:' )
    print (a) 
    print ('
    ')
    
    print ('排序:' )
    print (np.sort(a)) 
    print ('
    ') 
      
    print ('轴 0 排序:') 
    print (np.sort(a, axis = 0)) 
    print ('
    ')  
    
    # 排序函数中的顺序参数
    dt = np.dtype([('name', 'S10'),('age', int)]) 
    a = np.array([("kevin", 21),("peter",25),("tony", 17), ("mike",27)], dtype = dt) 
    
    print ('数组:') 
    print (a) 
    print ('
    ')  
    
    print ('按 name 排序:') 
    print (np.sort(a, order = 'name'))
    

    输出

    数组:
    [[3 7]
     [9 1]]
    
    排序:
    [[3 7]
     [1 9]]
    
     轴 0 排序:
    [[3 1]
     [9 7]]
    
    数组:
    [(b'kevin', 21) (b'peter', 25) (b'tony', 17) (b'mike', 27)]
    
    按 name 排序:
    [(b'kevin', 21) (b'mike', 27) (b'peter', 25) (b'tony', 17)]
    
    

    numpy.argsort()

    该函数先对数组进行排序,然后提取排序后的数组索引,以数组形式返回,原数组不会被修改,通过索引可以得到排序结果。

    示例

    import numpy as np 
    x = np.array([3, 1, 2]) 
    
    print ('数组x:') 
    print (x) 
    print ('
    ')  
    
    print ('将argsort()应用于x:') 
    y = np.argsort(x) 
    print (y) 
    print ('
    ')  
    
    print ('按排序顺序重建原始数组:' )
    print (x[y]) 
    print ('
    ')  
    
    print ('使用循环重构原始数组:') 
    for i in y: 
       print (x[i])
    

    输出

    数组x:
    [3 1 2]
    
    将argsort()应用于x:
    [1 2 0]
    
    按排序顺序重建原始数组:
    [1 2 3]
    
    使用循环重构原始数组:
    1 
    2 
    3
    

    numpy.lexsort()

    用于对多个序列进行排序,类似于SQL中的ORDERBY多个字段:ORDER BY 字段1, 字段2, 字段3。可以想象成对电子表格进行排序,每一列代表一个序列,越后面的列优先级越高。

    原数组不会被修改,该函数提取排序后的数组索引,以数组形式返回,通过索引可以得到排序结果。

    示例

    import numpy as np  
      
    a = np.array(['a','b','c','d','e'])  
      
    b = np.array([12, 90, 380, 12, 211])  
      
    ind = np.lexsort((a,b))  
      
    print("打印排序后的数组索引:")  
      
    print(ind)  
      
    print("使用索引对数组排序:")  
      
    for i in ind:  
        print(a[i],b[i])  
    

    输出

    打印排序后的数组索引:
    [0 3 1 4 2]
    使用索引对数组排序:
    a 12
    d 12
    b 90
    e 211
    c 380
    

    numpy.argmax() 与 numpy.argmin()

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

    示例

    import numpy as np 
    a = np.array([[30,40,70],[80,20,10],[50,90,60]]) 
    
    print ('数组:') 
    print (a) 
    print ('
    ') 
    
    print ('应用argmax()函数:') 
    print (np.argmax(a, 0)) 
    print ('
    ')  
    
    print ('应用argmin()函数:') 
    print (np.argmin(a, 0) ) 
    print ('
    ')  
    
    

    输出

     数组:
    [[30 40 70]
     [80 20 10]
     [50 90 60]]
    
    应用argmax()函数:
    [1 2 0]
    
    应用argmin()函数:
    [0 1 1]
    

    numpy.nonzero()

    该函数返回数组中非零元素的索引。

    示例

    import numpy as np  
      
    b = np.array([12, 90, 380, 12, 211])  
      
    print("打印原始数组
    ", b)  
    print ('
    ') 
      
    print("打印非零元素的位置")  
    print(b.nonzero())  
    

    输出

    打印原始数组 
    [ 12  90 380  12 211]
    
    打印非零元素的位置
    (array([0, 1, 2, 3, 4]),)
    
    

    numpy.where()

    该函数查找数组中符合条件的元素,返回其索引。

    示例

    import numpy as np  
      
    b = np.array([12, 90, 380, 12, 211])  
      
    print(np.where(b>12))  
      
    c = np.array([[20, 24],[21, 23]])  
      
    print(np.where(c>20))  
    

    输出

    (array([0, 1, 1]), array([1, 0, 1]))
    

    numpy.extract()

    该函数返回数组中符合条件的元素。

    示例

    import numpy as np  
      
    b = np.array([12, 90, 380, 12, 211])  
      
    print(np.extract(b>12, b))  
      
    c = np.array([[20, 24],[21, 23]])  
      
    print(np.extract(c>20, c))  
    

    输出

    [ 90 380 211]
    [24 21 23]
    
  • 相关阅读:
    socket的一个错误的解释SocketException以及其他几个常见异常
    lambda表达式和ef的语句转化
    多线程的异步委托初识
    跨线程访问控件的方法
    P1337 [JSOI2004]平衡点 / 吊打XXX
    P4099 [HEOI2013]SAO
    UVA10529 Dumb Bones
    P1291 [SHOI2002]百事世界杯之旅
    P2675 《瞿葩的数字游戏》T3-三角圣地
    P4363 [九省联考2018]一双木棋chess
  • 原文地址:https://www.cnblogs.com/jinbuqi/p/11344437.html
Copyright © 2011-2022 走看看