【Numpy】numpy.lexsort()

1350 ワード

numpy.lexsort()
numpy.lexsort()は、複数のシーケンスをソートするために使用されます.スプレッドシートのソートを想像し、各列はシーケンスを表し、ソート時に後ろの列を優先的に配慮します.
ここで1つの応用シーンを挙げます:小升初試験、重点クラスの合格学生は総成績によって合格します.総成績が同じで、数学の成績が高い優先採用は、総成績と数学の成績が同じで、英語の成績によって採用されます......ここで、総成績はスプレッドシートの最後の列に並んで、数学の成績は最後から2列目で、英語の成績は最後から3列目です.
例1
>>> surnames =    ('Hertz',    'Galilei', 'Hertz')
>>> first_names = ('Heinrich', 'Galileo', 'Gustav')
>>> ind = np.lexsort((first_names, surnames))
>>> ind
array([1, 2, 0])
>>>

>>> [surnames[i] + ", " + first_names[i] for i in ind]
['Galilei, Galileo', 'Hertz, Gustav', 'Hertz, Heinrich']

ソートルール:まずsurnamesのアルファベットに対応するasciiコードサイズでソートし、ソートできない場合はfirst_namesアルファベットに対応するasciiコードサイズをソートします.
では、この例ではsurnamesの「Galilei」は他のものより小さく、最初のもので、「Hertz」は「Hertz」と同じ大きさで、first_nameの対応する位置のデータを並べ替え,明らかに'Gustav'が'Heinrich'より小さい.したがって、インデックス値は1,2,0である.
例2
>>> a = [1,5,1,4,3,4,4] # First column
>>> b = [9,4,0,4,0,2,1] # Second column
>>> ind = np.lexsort((b,a)) # Sort by a, then by b
>>> print(ind)
[2 0 4 6 5 3 1]
>>>

>>> [(a[i],b[i]) for i in ind]
[(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)]