NumPyソートの実現

4730 ワード

numpy.sort()関数
この関数は様々な並べ替え機能を提供しています。規格化、並べ替え、積み上げ、快速並べ替えなどの様々な並べ替えアルゴリズムをサポートしています。
numpy.sort()を使う方法のフォーマットは以下の通りです。
numpy.sort(a,axis,kind,order)
  • a:並べ替え行列
  • axis:並べ替えの軸に沿ってaxis=0を並べ替えて、axis=1は行によって並べ替えます。
  • kind:並べ替えに使用されるアルゴリズムは、デフォルトではクイックソートを使用します。よく使う並べ替えの方法はまだあります。
  • quicksort:クイックソート、最速、アルゴリズムの不安定性
  • mergsort:正規並べ替えは安定性があり、空間の複雑さが高いという利点があり、一般的に外部並べ替えの時に
  • を考慮することができる。
  • heappsort:ヒープソートの利点は、ヒープの順序付けが最悪の場合、その時間の複雑さもO(nlogn)であり、最高効率かつ最も省スペースなソート方法である

  • order:フィールドが含まれている場合、並べ替えフィールド(配列内の要素項目に従って並べ替える)を表します。
  • numpy.sort()関数の使い方を具体的に説明します。
    ユーザ名とユーザの年齢を含めて、ユーザの年齢によって並べ替えられます。
    
    dt=np.dtype([('name','S20'),('age','i4')])
    a=np.array([('adm','19'),('wan','23'),('ade','23')],dtype=dt)
    s=np.sort(a,order='age',kind='quicksort')
    print(s)
    
    実行結果:
     [(b'adm',19)(b'ade',23)(b'wan',23)]
    Process finished with exit code 0
    numpy.argsort()関数
    numpy.argsort()関数が返ってきたときに、小さいから大きいまでの要素の索引
    以下の例を通して、より良い理解が可能である。
    argsort()を使ってインデックスを返し、配列を再構成します。
    
    x=np.array([3,8,11,2,5])
    print('         ')
    y=np.argsort(x)
    print(y)
    print('         ')
    print(x[y])
    print('     ')
    for i in y:
      print(x[i],end=",")
    
    実行結果:
    小さいインデックスを返します。
    [3 0 4 1 2]
    インデックスで元の配列をソート
    [2]  3  5  8 11)
    元の配列を再構築
    2,3,5,8,11,
    Process finished with exit code 0
    numpy.lexsort()関数
    numpy.sort()関数は複数のシーケンスに対して並べ替えられます。例えば、私達は比較成績の時にまず総成績を比較して、後列から前列の優先順位に比べて、この時にlexsort()の方法を使いました。
    
    nm = ('raju','anil','ravi','amar')
    dv = ('f.y.', 's.y.', 's.y.', 'f.y.')
    ind = np.lexsort((dv,nm))
    print ('   lexsort()   :')
    print (ind) 
    print ('
    ') print (' :') print ([nm[i] + ", " + dv[i] for i in ind])
    実行結果:
    このインデックスを使って並べ替えデータを取得します。
    [amar,f.y.',anil,s.y.',raju,f.y.','ravi,s.y.']
    Process finished with exit code 0
    numpy.partition()関数
    numpy.partition()はパーティションソートといい、配列をパーティションするための数を指定できます。
    フォーマットは以下の通りです
    
    partition(a,kth[,axis,kind,order])
    
    例:配列中の7より小さい要素を前面に置くことを実現し、7より大きいものを後ろに置く。
    
    # partition    
    a=np.array([2,3,9,1,0,7,23,13])
    print(np.partition(a,7))
    
    実行結果:
    [0]  1  2  3  7  9 13 23)
    Process finished with exit code 0
    例:配列の中の7より小さい要素を前に置くことを実現し、10より大きいものを後ろに置いて、7-10の間の要素を中間に置く。
    パーティションのソート
    
    a = np.array([2, 3, 9, 1, 6, 5, 0, 12, 10, 7, 23, 13, 27])
    print(np.partition(a, (7, 10)))
    print(np.partition(a, (2, 7)))
    
    実行結果
    [1]  0  2  3  5  6  7  9 10 12 13、23、27)
    [0]  1  2  6  5  3  7  9 10 12 23、13、27)
    Process finished with exit code 0
    注意:(7、10)の10の位置は、配列の長さを超えてはいけません。
    numpy.nonzo()関数
    入力配列の非ゼロ要素の索引を返します。
    
    a = np.array([[30,40,0],[0,20,10],[50,0,60]]) 
    print ('      :')
    print (a)
    print ('
    ') print (' nonzero() :') print (np.nonzero (a))
    実行結果:
    私たちの配列は:
    [[30 40]  0)
     [ 0 20 10]
     [50  0 60]
    nonzero()関数を呼び出します。
    (array([0,0,1,2,2])、array([0,1,1,2,0,2,2])
    Process finished with exit code 0
    numpy.where()関数
    入力条件を満たす索引を返します。
    
     where()     
    b = np.array([2, 1, 3, 0, 4, 7, 23, 13, 27])
    y = np.where(b > 10)
    print(y)
    print('            ')
    print(b[y])
    
    実行結果:
    (array([6,7,8],dtype=int 64)
    配列内の要素を索引で取得します。
    [23 13 27]
    Process finished with exit code 0
    numpy.extract()関数
    numpy.extract()関数で実装されたのは、カスタム条件を返す要素です。
    
    # extract()       
    b = np.array([2, 1, 3, 0, 4, 7, 23, 13, 27])
    con = np.mod(b, 2) == 0
    y = np.extract(con, b)
    print(a[y])
    
    実行結果:
    [9 2 6]
    Process finished with exit code 0
    その他の並べ替え関数
    numpy.argmax()とnumpy.argmin()関数は、それぞれ与えられた軸に沿って最大と最小の要素のインデックスを返します。numpy.sort_compplex(a)関数は、複数の先行実数部の虚部の順に並べ替えられます。numpy.argpartition(a,kth[,axis,kind,order])関数は、指定されたキーワードに沿って配列をパーティションすることを実現します。
    複数並べ替えの例を以下に挙げます。
    
    t = np.array([ 1.+2.j, 2.-1.j, 3.-3.j, 3.-2.j, 3.+5.j])
    res = np.sort_complex([1 + 2j, 2 - 1j, 3 - 2j, 3 - 3j, 3 + 5j])
    print(res)
    
    実行結果:
    [1.+2.j 2.1.j 3-3.j 3-2.j 3.+ 5.j]
    Process finished with exit code 0
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。