Numpy: argsort рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдорд╛рд░реНрдЪ 2017  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: numpy/numpy

Argsort рдлрд╝рдВрдХреНрд╢рди рдЯреВрдЯрд╛ рд╣реБрдЖ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП argsort [0, 1] рд╕рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдкрдВрдХреНрддрд┐рдпреЛрдВ [2, 3] рдХреЗ рд▓рд┐рдП рдЧрдбрд╝рдмрдбрд╝ рд╣реИред
рдореИрдВрдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ NumPy рдЗрдВрд╕реНрдЯрд╛рд▓реЗрд╢рди рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 1.11.0 рдФрд░ 1.12.0 . рдкрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛

import numpy as np

vec = np.array([
    [-1.4, -1.2,  1.3],
    [-3.6,  3.9, -3.7],
    [-2.3,  1.5, -2. ],
    [-2.6,  2.4, -1.6]
    ])

In [1]: np.argsort(-vec, axis=1)
Out[1]: 
array([[2, 1, 0],
       [1, 0, 2],
       [1, 2, 0],
       [1, 2, 0]])

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

"np argsort рдЧрд▓рдд" рдХреЗ рд▓рд┐рдП рдпрд╣ рджреВрд╕рд░рд╛ Google рдкрд░рд┐рдгрд╛рдо рд╣реИред

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреГрд╖реНрда рдкрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ (рдореЗрд░реЗ рд▓рд┐рдП)ред рдореИрдВ рдЕрдкрдиреА рдЦреБрдж рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╣рд╛рдБ рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░реЗ:

x = numpy.array([1.48,1.31,0.0,0.8])
print x.argsort()

>[2 3 1 0]

рдХреБрдЫ рд▓реЛрдЧ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп [3, 2, 0, 1] рджреЗрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдХреНрд░рдордмрджреНрдз рд╕рд░рдгреА рдореЗрдВ 0рд╡рд╛рдВ рддрддреНрд╡ рдХреНрд░рдордмрджреНрдз рд╕рд░рдгреА рдореЗрдВ рддреАрд╕рд░рд╛ рддрддреНрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ x[np.argsort(x)] рдЖрдкрдХреЛ рдПрдХ рдХреНрд░рдордмрджреНрдз рд╕реВрдЪреА рджреЗрдЧрд╛, рдпрд╛рдиреА [0.0, 0.8, 1.31, 1.48] ред рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рд░рдЦреЗрдВ, [2 3 1 0] рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдХрд╛ 0рд╡рд╛рдВ рддрддреНрд╡ рдЕрдирд╕реЛрд▓реНрдб рдРрд░реЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрддреНрд╡ рд╣реИред

рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ [3, 2, 0, 1] рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

np.argsort(np.argsort(x))
>[3 2 0 1]

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рдЬреИрд╕реЗ рдСрдл-рдмреЗрд╕ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ x рдореЗрдВ 3 рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХрд╣реЗрдВ:

np.argsort(x)[:-4:-1]
>[0, 1, 3]

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ, vec[np.arange(4)[:, np.newaxis], np.argsort(-vec, axis=1)] рдкреНрд░рд┐рдВрдЯ рдЖрдЙрдЯ рд▓реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред

"np argsort рдЧрд▓рдд" рдХреЗ рд▓рд┐рдП рдпрд╣ рджреВрд╕рд░рд╛ Google рдкрд░рд┐рдгрд╛рдо рд╣реИред

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреГрд╖реНрда рдкрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ (рдореЗрд░реЗ рд▓рд┐рдП)ред рдореИрдВ рдЕрдкрдиреА рдЦреБрдж рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╣рд╛рдБ рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░реЗ:

x = numpy.array([1.48,1.31,0.0,0.8])
print x.argsort()

>[2 3 1 0]

рдХреБрдЫ рд▓реЛрдЧ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп [3, 2, 0, 1] рджреЗрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдХреНрд░рдордмрджреНрдз рд╕рд░рдгреА рдореЗрдВ 0рд╡рд╛рдВ рддрддреНрд╡ рдХреНрд░рдордмрджреНрдз рд╕рд░рдгреА рдореЗрдВ рддреАрд╕рд░рд╛ рддрддреНрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ x[np.argsort(x)] рдЖрдкрдХреЛ рдПрдХ рдХреНрд░рдордмрджреНрдз рд╕реВрдЪреА рджреЗрдЧрд╛, рдпрд╛рдиреА [0.0, 0.8, 1.31, 1.48] ред рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рд░рдЦреЗрдВ, [2 3 1 0] рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдХрд╛ 0рд╡рд╛рдВ рддрддреНрд╡ рдЕрдирд╕реЛрд▓реНрдб рдРрд░реЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрддреНрд╡ рд╣реИред

рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ [3, 2, 0, 1] рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

np.argsort(np.argsort(x))
>[3 2 0 1]

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рдЬреИрд╕реЗ рдСрдл-рдмреЗрд╕ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ x рдореЗрдВ 3 рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХрд╣реЗрдВ:

np.argsort(x)[:-4:-1]
>[0, 1, 3]

рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ [3, 2, 0, 1] рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рддреЗрдЬ рд╣реЛрдЧрд╛:

a = np.empty(len(x), np.intp)
a[np.argsort(x)] = np.arange(len(x))

9880 рдЗрд╕реЗ np.invert_permutation(np.argsort(x)) . рдХреЗ рд░реВрдк рдореЗрдВ numpy рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ

@rossbar , @bjnath : рд╢рд╛рдпрдж рдЙрдкрд░реЛрдХреНрдд @ghost рдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╕рд╛рдорд╛рди рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ? рдореИрдВрдиреЗ рднреНрд░рдо рдХреЗ рдФрд░ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдХреНрд░реЙрд╕рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

manuels picture manuels  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Kreol64 picture Kreol64  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

astrofrog picture astrofrog  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amuresan picture amuresan  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

inducer picture inducer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ