Π Π°Π·Π½ΠΎΠ΅

Np argsort: Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ argsort Π² python

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

argsort | NumPy


numpy.argsort(a, axis=-1, kind='quicksort', order=None)

Ѐункция argsort() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ индСксы, ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты исходного массива.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:
a — массив NumPy ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ массиву ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.
Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ массив.
axis — Ρ†Π΅Π»ΠΎΠ΅ число (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€).
ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ ось вдоль ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выполняСтся сортировка элСмСнтов. Если Ρ€Π°Π²Π΅Π½ None, Ρ‚ΠΎ сортировка выполняСтся ΠΏΠΎ сТатому Π΄ΠΎ ΠΎΠ΄Π½ΠΎΠΉ оси ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ исходного массива. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ axis = -1, Ρ‡Ρ‚ΠΎ соотвСтствуСт сортировкС ΠΏΠΎ послСднСй оси массива.
kind — строка (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€).
Одна строка ΠΈΠ· мноТСства {'quicksort', 'mergesort', 'heapsort', 'stable'}, которая ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 'stable' ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ автоматичСскому Π²Ρ‹Π±ΠΎΡ€Ρƒ устойчивого, Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° для Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… сортируСмого массива. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ kind = 'quicksort'.
order — строка ΠΈΠ»ΠΈ список строк (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€).
Π’ случаС, ΠΊΠΎΠ³Π΄Π° массив a являСтся структурированным, ΠΈ Π΅Π³ΠΎ полям присвоСно имя, Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ позволяСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ порядок Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡ‡Π°Π²ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² сортировкС Если ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π½Π΅ всС поля, Ρ‚ΠΎ Π½Π΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ порядкС Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ пСрСчислСны Π² dtype структурированного массива.
Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚:
ndarray — массив NumPy
Массив индСксов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ элСмСнты исходного массива вдоль ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ оси axis. Если a это ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив, Ρ‚ΠΎ a[np.argsort(a)] Π²Π΅Ρ€Π½Π΅Ρ‚ Π΅Π³ΠΎ отсортированным. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ отсортированныС ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Π»ΠΈΠ±ΠΎ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Π½ΠΈΠΌ с использованиСм Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ массива индСксов, Π»ΠΈΠ±ΠΎ воспользовавшись ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ np.take_along_axis(a, np.argsort(a, axis = ax), axis=ax).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠžΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы:

>>> import numpy as np
>>> 
>>> a = np. random.randint(0, 20, 10)
>>> a
array([ 8, 17,  8, 14, 14, 16,  4,  3, 12,  6])
>>> 
>>> ind = np.argsort(a)
>>> ind
array([7, 6, 9, 0, 2, 8, 3, 4, 5, 1], dtype=int32)
>>> 
>>> a[ind]
array([ 3,  4,  6,  8,  8, 12, 14, 14, 16, 17])

Π”Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы:

>>> a = np.random.randint(0, 20, (3, 4))
>>> a
array([[19,  3,  5,  6],
       [ 0,  0,  3,  2],
       [13, 14,  8, 13]])
>>> 
>>>               
>>> #  Π˜Π½Π΄Π΅ΠΊΡΡ‹ отсортированных строк:
... ind_r = np.argsort(a)    #  эквивалСнтно ind_r = np.argsort(a, axis = 1)
>>> ind_r
array([[1, 2, 3, 0],
       [0, 1, 3, 2],
       [2, 0, 3, 1]], dtype=int32)
>>> 
>>> 
>>> #  Π˜Π½Π΄Π΅ΠΊΡΡ‹ отсортированных столбцов:
... ind_c = np.argsort(a, axis = 0)
>>> ind_c
array([[1, 1, 1, 1],
       [2, 0, 0, 0],
       [0, 2, 2, 2]], dtype=int32)

Π‘Π°ΠΌΡ‹ΠΉ простой способ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ отсортированный массив — Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ np. take_along_axis():

>>> np.take_along_axis(a, ind_r, axis = 1)
array([[ 3,  5,  6, 19],
       [ 0,  0,  2,  3],
       [ 8, 13, 13, 14]])
>>> 
>>> np.take_along_axis(a, ind_c, axis = 0)
array([[ 0,  0,  3,  2],
       [13,  3,  5,  6],
       [19, 14,  8, 13]])

Ѐункция np.argsort() Ρ‚Π°ΠΊ ΠΆΠ΅ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π»Π΅ΠΊΡΠΈΠΊΠΎΠ³Ρ€Π°Ρ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ сортировку структурированного массива:

>>> arr = np.array([(0, 12), (0, 11), (1, 55),
...                 (0, 87), (1, 54), (1, 21)],
...                dtype = np.dtype([('a', int), ('b', int)]))
>>> arr
array([(0, 12), (0, 11), (1, 55), (0, 87), (1, 54), (1, 21)],
      dtype=[('a', '<i4'), ('b', '<i4')])
>>> 
>>> ind = np.argsort(arr, order = ['a', 'b'])
>>> ind
array([1, 0, 3, 5, 4, 2], dtype=int32)
>>> 
>>> arr[ind]
array([(0, 11), (0, 12), (0, 87), (1, 21), (1, 54), (1, 55)],
      dtype=[('a', '<i4'), ('b', '<i4')])
>>> 
>>> 
>>> ind = np. argsort(arr, order = ['b', 'a'])
>>> ind
array([1, 0, 5, 4, 2, 3], dtype=int32)
>>> 
>>> arr[ind]
array([(0, 11), (0, 12), (1, 21), (1, 54), (1, 55), (0, 87)],
      dtype=[('a', '<i4'), ('b', '<i4')])

МоТно Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ argsort Π² порядкС убывания?

Если Π²Ρ‹ ΠΎΡ‚Ρ€ΠΈΡ†Π°Π΅Ρ‚Π΅ массив, самыС Π½ΠΈΠ·ΠΊΠΈΠ΅ элСмСнты становятся самыми высокими элСмСнтами ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, индСксы n самых высоких элСмСнтов Ρ€Π°Π²Π½Ρ‹:

(-avgDists).argsort()[:n]

Π”Ρ€ΡƒΠ³ΠΎΠΉ способ Ρ€Π°ΡΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ ΠΎΠ± этом, ΠΊΠ°ΠΊ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² коммСнтариях , состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ большиС элСмСнты ΠΈΠ΄ΡƒΡ‚ послСдними Π² argsort. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· хвоста argsort, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ n самых высоких элСмСнтов:

avgDists. argsort()[::-1][:n]

Оба ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠΌΠ΅ΡŽΡ‚ O(n log n) Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ слоТности, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² argsort являСтся здСсь Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠΌ. Но Ρƒ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ прСимущСство: ΠΎΠ½ замСняСт ΠΎΡ‚Ρ€ΠΈΡ†Π°Π½ΠΈΠ΅ O(n) массива срСзом O(1) . Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с нСбольшими массивами Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ², Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, избСгая этого отрицания, Π° Ссли Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌΠΈ массивами, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π½Π° использовании памяти, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΡ‚Ρ€ΠΈΡ†Π°Π½ΠΈΠ΅ создаСт копию всСго массива.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ , Ρ‡Ρ‚ΠΎ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π΅ всСгда Π΄Π°ΡŽΡ‚ эквивалСнтныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹: Ссли трСбуСтся ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ рСализация сортировки Π² argsort, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ссли ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ kind='mergesort' , Ρ‚ΠΎ пСрвая стратСгия сохранит ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ сортировки, Π½ΠΎ вторая стратСгия Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ (Ρ‚. Π΅. ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Ρ€Π°Π²Π½Ρ‹Ρ… элСмСнтов Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΉΠΌΠΈΠ½Π³ΠΎΠ² :

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ нСбольшой массив ΠΈΠ· 100 ΠΏΠΎΠΏΠ»Π°Π²ΠΊΠΎΠ² ΠΈ хвост Π΄Π»ΠΈΠ½ΠΎΠΉ 30, ΠΌΠ΅Ρ‚ΠΎΠ΄ просмотра Π±Ρ‹Π» ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° 15% быстрСС

>>> avgDists = np. random.rand(100)
>>> n = 30
>>> timeit (-avgDists).argsort()[:n]
1.93 Β΅s Β± 6.68 ns per loop (mean Β± std. dev. of 7 runs, 1000000 loops each)
>>> timeit avgDists.argsort()[::-1][:n]
1.64 Β΅s Β± 3.39 ns per loop (mean Β± std. dev. of 7 runs, 1000000 loops each)
>>> timeit avgDists.argsort()[-n:][::-1]
1.64 Β΅s Β± 3.66 ns per loop (mean Β± std. dev. of 7 runs, 1000000 loops each)

Для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… массивов argsort являСтся Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ, ΠΈ Π½Π΅Ρ‚ сущСствСнной Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

>>> avgDists = np.random.rand(1000)
>>> n = 300
>>> timeit (-avgDists).argsort()[:n]
21.9 Β΅s Β± 51.2 ns per loop (mean Β± std. dev. of 7 runs, 10000 loops each)
>>> timeit avgDists.argsort()[::-1][:n]
21.7 Β΅s Β± 33.3 ns per loop (mean Β± std. dev. of 7 runs, 10000 loops each)
>>> timeit avgDists.argsort()[-n:][::-1]
21.9 Β΅s Β± 37.1 ns per loop (mean Β± std. dev. of 7 runs, 10000 loops each)

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΎΡ‚ nedim Π½ΠΈΠΆΠ΅ Π½Π΅Π²Π΅Ρ€Π΅Π½. УсСчСниС Π΄ΠΎ ΠΈΠ»ΠΈ послС рСвСрсирования Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния Π² эффСктивности, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π΅ эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡˆΠ°Π³Π°ΡŽΡ‚ ΠΏΠΎ Π²ΠΈΠ΄Ρƒ массива ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ ΠΈ фактичСски Π½Π΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅.

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив numpy Π² порядкС убывания? Ru Python

Π― ΡƒΠ΄ΠΈΠ²Π»Π΅Π½, Ρ‡Ρ‚ΠΎ этот ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ вопрос Π½Π΅ задавался Ρ€Π°Π½ΡŒΡˆΠ΅, Π½ΠΎ я Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ нашСл Π΅Π³ΠΎ Π½Π° SO ΠΈΠ»ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ np.sort .

Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, Ρƒ мСня Π΅ΡΡ‚ΡŒ случайный массив numpy, содСрТащий Ρ†Π΅Π»Ρ‹Π΅ числа, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

 > temp = np.random.randint(1,10, 10) > temp array([2, 4, 7, 4, 2, 2, 7, 6, 4, 4]) 

Если я Π΅Π³ΠΎ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽ, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ:

 > np.sort(temp) array([2, 2, 2, 4, 4, 4, 4, 6, 7, 7]) 

Π½ΠΎ я Ρ…ΠΎΡ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ Π² порядкС убывания.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ я знаю, Ρ‡Ρ‚ΠΎ всСгда ΠΌΠΎΠ³Ρƒ:

 reverse_order = np.sort(temp)[::-1] 

Π½ΠΎ эффСктивно Π»ΠΈ это послСднСС ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅? Π Π°Π·Π²Π΅ ΠΎΠ½ Π½Π΅ создаСт копию Π² порядкС возрастания, Π° Π·Π°Ρ‚Π΅ΠΌ отмСняСт эту копию, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС? Если это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π°ΠΊ, Π΅ΡΡ‚ΡŒ Π»ΠΈ эффСктивная Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°? Π­Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ np. sort ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для измСнСния Π·Π½Π°ΠΊΠ° сравнСний Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сортировки для получСния Π²Π΅Ρ‰Π΅ΠΉ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.

temp[::-1].sort() сортируСт массив Π½Π° мСстС, np.sort(temp)[::-1] создаСт Π½ΠΎΠ²Ρ‹ΠΉ массив.

 In [25]: temp = np.random.randint(1,10, 10) In [26]: temp Out[26]: array([5, 2, 7, 4, 4, 2, 8, 6, 4, 4]) In [27]: id(temp) Out[27]: 139962713524944 In [28]: temp[::-1].sort() In [29]: temp Out[29]: array([8, 7, 6, 5, 4, 4, 4, 4, 2, 2]) In [30]: id(temp) Out[30]: 139962713524944 

Для ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… массивов я ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ np.argsort() , найдя индСксы отсортированного ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ массива, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ быстрСС, Ρ‡Π΅ΠΌ рСвСрсированиС отсортированного массива:

 In [37]: temp = np.random.randint(1,10, 10) In [38]: %timeit np.sort(temp)[::-1] 100000 loops, best of 3: 4.65 Β΅s per loop In [39]: %timeit temp[np.argsort(-temp)] 100000 loops, best of 3: 3.91 Β΅s per loop 

К соТалСнию, ΠΊΠΎΠ³Π΄Π° Ρƒ вас слоТный массив, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ np. sort(temp)[::-1] . Π”Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, упомянутых здСсь, нСэффСктивны.

 >>> a=np.array([5, 2, 7, 4, 4, 2, 8, 6, 4, 4]) >>> np.sort(a) array([2, 2, 4, 4, 4, 4, 5, 6, 7, 8]) >>> -np.sort(-a) array([8, 7, 6, 5, 4, 4, 4, 4, 2, 2]) 

4 ΠΏΡ€ΠΈΠ΅ΠΌΠ° Python NumPy, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½ΠΎΠ²ΠΈΡ‡ΠΎΠΊ

NumPy являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· самых популярных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π²Β Python, ΠΈ, учитывая Π΅Π΅ прСимущСства,Β ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ программист Python использовал Π΄Π°Π½Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для арифмСтичСских вычислСний. ΠœΠ°ΡΡΠΈΠ²Ρ‹ Numpy Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹, Ρ‡Π΅ΠΌ списки Python. Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ эффСктивным Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ способом.Β 

Помогая ΠΊΠΎΠ»Π»Π΅Π³Π°ΠΌ ΠΈ Π΄Ρ€ΡƒΠ·ΡŒΡΠΌ с трудностями Π² NumPy, ΠΌΡ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΊ 4 ΠΏΡ€ΠΈΠ΅ΠΌΠ°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½ΠΎΠ²ΠΈΡ‡ΠΎΠΊ Python. Π­Ρ‚ΠΈ Ρ„ΠΈΡˆΠΊΠΈ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½Ρ‹Π΅ ΠΈ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Π΅ ΠΊΠΎΠ΄Ρ‹. Β 

1. Arg-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ

Для массива Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ arr, np.argmax(arr), np.argmin(arr) ΠΈ np.argwhere(condition(arr)) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ условиям ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ соотвСтствСнно. Π₯отя эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ arg ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΌΡ‹ часто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ np.argsort(), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ массив.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ np.argsort для сортировки Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ массивов ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ массиву. НиТС прСдставлСн примСр сортировки ΠΈΠΌΠ΅Π½ студСнтов с использованиСм ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² экзамСна. ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ массив ΠΈΠΌΠ΅Π½ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² исходный порядок, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ np.argsort(np.argsort(score)).

1. score = np.array([70, 60, 50, 10, 90, 40, 80])
2. name = np.array(['Ada', 'Ben', 'Charlie', 'Danny', 'Eden', 'Fanny', 'George'])
3. sorted_name = name[np.argsort(score)] # an array of names in ascending order of their scores
4. print(sorted_name) # ['Danny' 'Fanny' 'Charlie' 'Ben' 'Ada' 'George' 'Eden']
5.
6. original_name = sorted_name[np.argsort(np.argsort(score))]
7. print(original_name) # ['Ada' 'Ben' 'Charlie' 'Danny' 'Eden' 'Fanny' 'George']
8.
9.
10. %timeit name[np.argsort(score)]
11. # 1.83 Β΅s Β± 182 ns per loop (mean Β± std. dev. of 7 runs, 100000 loops each)
12. %timeit sorted(zip(score, name))
13. # 3.2 Β΅s Β± 76.7 ns per loop (mean Β± std. dev. of 7 runs, 100000 loops each)

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡˆΠ΅, Π½Π΅ΠΆΠ΅Π»ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ использования встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python sorted(zip()). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½Π°, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Π°.

2. Бродкастинг β€” Ρ„ΠΎΡ€ΠΌΡ‹

Бродкастинг — это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΎΠΊ numpy ΠΌΠΎΠ³ ΡƒΠΆΠ΅ нСвольно ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. МногиС арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ numpy ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΊ ΠΏΠ°Ρ€Π°ΠΌ массивов одинаковой формы для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта. Бродкастинг Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с массивами бСз создания Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΏΠΈΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ эффСктивной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΈ Π±ΠΎΠ»Π΅Π΅ высокой читаСмости ΠΊΠΎΠ΄Π°.

НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ всСх Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² массивС Π½Π° 1, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ arr + 1 нСзависимо ΠΎΡ‚ измСрСния arr. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, всС Π»ΠΈ значСния Π² массивС большС, Ρ‡Π΅ΠΌ 2, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ arr > 2.

Но ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ, совмСстимы Π»ΠΈ Π΄Π²Π° массива с бродкастинг?

Argument 1 (4D array): 7 Γ— 5 Γ— 3 Γ— 1
Argument 2 (3D array): 1 Γ— 3 Γ— 9
Output (4D array): 7 Γ— 5 Γ— 3 Γ— 9

Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ массива Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ Ρ€Π°Π²Π½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ массива, Π»ΠΈΠ±ΠΎΒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½ΠΈΡ… Ρ€Π°Π²Π½ΠΎ 1. ΠœΠ°ΡΡΠΈΠ²Ρ‹ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎ продСмонстрировано Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅.

3. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ellipsis ΠΈ NewAxis

Бинтаксис для Π½Π°Ρ€Π΅Π·ΠΊΠΈ массива numpy — это i:jΒ Π³Π΄Π΅Β i, jΒ — Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ индСкс ΠΈ индСкс остановки соотвСтствСнно. НапримСр, для массива numpy arr = np.array(range(10)) ΠΊΠΎΠΌΠ°Π½Π΄Π° arr[:3] Π΄Π°Π΅Ρ‚ [0, 1, 2].Β 

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с массивами с Π±ΠΎΠ»Π΅Π΅ высокими размСрностями ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΒ  :  для Π²Ρ‹Π±ΠΎΡ€Π° индСкса ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ оси. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ … для Π²Ρ‹Π±ΠΎΡ€Π° индСксов ΠΏΠΎ нСскольким осям. Π’ΠΎΡ‡Π½ΠΎΠ΅ количСство осСй выводится.Β 

1. arr = np.array(range(1000)).reshape(2,5,2,10,-1)
2. print(arr[:,:,:,3,2] == arr[...,3,2])
3. # [[[ True, True],
4. # [ True, True],
5. # [ True, True],
6. # [ True, True],
7. # [ True, True]],
8. # [[ True, True],
9. # [ True, True],
10. # [ True, True],
11. # [ True, True],
12. # [ True, True]]])
13.
14. print(arr.shape) # (2, 5, 2, 10, 5)
15. print(arr[...,np.newaxis,:,:,:].shape) # (2, 5, 1, 2, 10, 5)

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, использованиС, np.newaxis,Β ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅, вставляСт Π½ΠΎΠ²ΡƒΡŽ ось в Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ оси. Π­Ρ‚Π° опСрация Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ Ρ„ΠΎΡ€ΠΌΡƒ массива Π½Π° ΠΎΠ΄Π½Ρƒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ измСрСния. Π₯отя это Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ np.expand_dims(), использованиС np.newaxis Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎ ΠΈ, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, изящно.Β 

4. Замаскированный массив — сСлСкция

Наборы Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹.  Они всСгда содСрТат массивы с ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΈΠ»ΠΈ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΌΠΈ записями, ΠΈ ΠΌΡ‹ часто Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти элСмСнты. НапримСр, измСрСния Π½Π° мСтСостанции ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ значСния ΠΈΠ·-Π·Π° сбоя Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°.

Π£ Numpy Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΌΠΎΠ΄ΡƒΠ»ΡŒΒ numpy.ma, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ массивы данных с масками. ΠœΠ°ΡΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ массив содСрТит ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ массив numpy ΠΈ маску, которая указываСт ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ нСдопустимых записСй.Β 

np.ma.MaskedArray(data=arr, mask=invalid_mask)

НСдопустимыС записи Π² массивС ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΠΎΠΌΠ΅Ρ‡Π°ΡŽΡ‚ΡΡ с использованиСм ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ строк. Если ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ замаскированноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, скаТСм -999, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ замаскированный массив, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ np.ma.masked_values(arr, value=-999). Π›ΡŽΠ±Π°Ρ опСрация numpy, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ замаскированный массив Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, автоматичСски ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ эти Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ записи, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

1. import math
2. def is_prime(n):
3. assert n > 1, 'Input must be larger than 1'
4. if n % 2 == 0 and n > 2:
5. return False
6. return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))
7.
8. arr = np.array(range(2,100))
9. non_prime_mask = [not is_prime(n) for n in a]
10. prime_arr = np.ma.MaskedArray(data=arr, mask=non_prime_mask)
11. print(prime_arr)
12. # [2 3 -- 5 -- 7 -- -- -- 11 -- 13 -- -- -- 17 -- 19 -- -- -- 23 -- -- -- --
13. # -- 29 -- 31 -- -- -- -- -- 37 -- -- -- 41 -- 43 -- -- -- 47 -- -- -- --
14. # -- 53 -- -- -- -- -- 59 -- 61 -- -- -- -- -- 67 -- -- -- 71 -- 73 -- --
15. # -- -- -- 79 -- -- -- 83 -- -- -- -- -- 89 -- -- -- -- -- -- -- 97 -- --]
16.
17. arr = np.array(range(11))
18. print(arr.sum()) # 55
19.
20. arr[-1] = -999 # indicates missing value
21. masked_arr = np.ma.masked_values(arr, -999)
22. print(masked_arr.sum()) # 45
23.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Numpy sort-sort (), argsort ()


ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚


1. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°: sort ()


Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ: Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сам массив

numpy. sort(a, axis=-1, kind='quicksort', order=None)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • a: массив numpy для сортировки
  • ось: отсортированноС ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ -1 послСднСС ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅, None сортируСтся послС выравнивания всСх элСмСнтов
  • Π’ΠΈΠ΄: Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки, Π΅ΡΡ‚ΡŒ: «быстрая сортировка», «слияниС», Β«heapsortΒ», Β«ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉΒ»
  • порядок: порядок ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ сортировки, ΠΏΠΎΠ»Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ построСно

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

import numpy as np
a = np.array([[1,4],[3,1]])

 # Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ послСднСму ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, каТдая строка сортируСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ
np.sort(a)               
=> narray([[1, 4],
           [1, 3]])

 # Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ 1D, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ столбСц сортируСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ         
np.sort(a, axis=0)
=> narray([[1, 1],
           [3, 4]])

 # Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС элСмСнты
np.sort(a, axis=None)
=> narray([1, 1, 3, 4])

 # ΠœΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Π°Ρ сортировка
dtype = [('name', 'S10'), ('height', float), ('age', int)]
values = [('Arthur', 1. 8, 41),  ('Lancelot', 1.9, 38), ('Galahad', 1.7, 38)]
a = np.array(values, dtype=dtype)
np.sort(a, order='height')                        
=> array([('Galahad', 1.7, 38), ('Arthur', 1.8, 41), ('Lancelot', 1.8999999999999999, 38)],
      	 dtype=[('name', '|S10'), ('height', '<f8'), ('age', '<i4')])

2. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° подстрочного индСкса: argsort ()


Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ: Π‘Π°ΠΌ массив остаСтся Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌ, Π° отсортированный индСксный массив возвращаСтся

numpy.argsort(a, axis=-1, kind='quicksort', order=None)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

  • a: массив numpy для сортировки
  • ось: отсортированноС ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ -1 послСднСС ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅, None сортируСтся послС выравнивания всСх элСмСнтов
  • Π’ΠΈΠ΄: Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки, Π΅ΡΡ‚ΡŒ: «быстрая сортировка», «слияниС», Β«heapsortΒ», Β«ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉΒ»
  • порядок: порядок ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ сортировки, ΠΏΠΎΠ»Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ построСно

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

import numpy as np

# ΠžΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив
x = np.  2) 
  0 
  Π½Π΅Ρ‚ 
  β€˜Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° слияниСм’ 
  2 
  О (ΠΏ * ΠΆΡƒΡ€Π½Π°Π»Π° (ΠΏ)) 
  ~ П / 2 
  Π΄Π° 
  Β«ΠŸΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½Π°Ρ сортировка» 
  3 
  О (ΠΏ * ΠΆΡƒΡ€Π½Π°Π»Π° (ΠΏ)) 
  0 
  Π½Π΅Ρ‚ 

numpy.sort ()

Ѐункция sort () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ копию Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ массива. Π˜ΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ β€”

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

ΠšΡƒΠ΄Π°,

Sr.No. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ описаниС
1

Массив для сортировки

2

ось

Ось, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ отсортирован массив. Если Π½Π΅Ρ‚, массив выравниваСтся, сортируСтся ΠΏΠΎ послСднСй оси

3

Π”ΠΎΠ±Ρ€Ρ‹ΠΉ

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это быстрая сортировка

4

порядок

Если массив содСрТит поля, порядок сортировки ΠΏΠΎΠ»Π΅ΠΉ

Массив для сортировки

ось

Ось, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ отсортирован массив. Если Π½Π΅Ρ‚, массив выравниваСтся, сортируСтся ΠΏΠΎ послСднСй оси

Π”ΠΎΠ±Ρ€Ρ‹ΠΉ

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это быстрая сортировка

порядок

Если массив содСрТит поля, порядок сортировки ΠΏΠΎΠ»Π΅ΠΉ

ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Live Demo

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 () выполняСт ΠΊΠΎΡΠ²Π΅Π½Π½ΡƒΡŽ сортировку Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ массива вдоль Π·Π°Π΄Π°Π½Π½ΠΎΠΉ оси ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π²ΠΈΠ΄ сортировки для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° массива индСксов Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎΡ‚ массив индСксов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для построСния отсортированного массива.

ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Live Demo

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 ()

Ѐункция выполняСт ΠΊΠΎΡΠ²Π΅Π½Π½ΡƒΡŽ сортировку с использованиСм ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ клавиш. ΠšΠ»ΡŽΡ‡ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ столбца Π² элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Π΅. Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив индСксов, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ отсортированныС Π΄Π°Π½Π½Ρ‹Π΅. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ послСдний ΠΊΠ»ΡŽΡ‡ являСтся ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ сортировки.

ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Live Demo

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 ()

Π­Ρ‚ΠΈ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ индСксы максимального ΠΈ минимального элСмСнтов соотвСтствСнно вдоль Π·Π°Π΄Π°Π½Π½ΠΎΠΉ оси.

ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Live Demo

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 () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ индСксы Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… элСмСнтов Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ массивС.

ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Live Demo

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 () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ индСксы элСмСнтов Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ массивС, Π³Π΄Π΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ условиС выполняСтся.

ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Live Demo

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 () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ элСмСнты, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ Π»ΡŽΠ±ΠΎΠΌΡƒ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ.

Live Demo

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)

Π­Ρ‚ΠΎ даст ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€”

Как ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив Numpy | ΠΏΠΈΡ‚ΠΎΠ½

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив Numpy. Π’ Numpy Π΅ΡΡ‚ΡŒ нСсколько способов сортировки массива Π² зависимости ΠΎΡ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ # 1: ΠŸΡ€ΠΎΡΡ‚ΠΎ отсортируйтС Π΄Π°Π½Π½Ρ‹ΠΉ массив Π½Π° основС оси, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ sort ().

import numpy as np

Β Β Β 

a = np.array([[12, 15], [10, 1]])

arr1 = np.sort(a, axis = 0)Β Β Β Β Β Β Β Β 

print ("Along first axis : \n", arr1)Β Β Β Β Β Β Β Β 

Β Β Β 

Β Β Β 

a = np.array([[10, 15], [12, 1]])

arr2 = np.sort(a, axis = -1)Β Β Β Β Β Β Β Β 

print ("\nAlong first axis : \n", arr2)

Β Β Β 

Β Β Β 

a = np.array([[12, 15], [10, 1]])

arr1 = np.sort(a, axis = None)Β Β Β Β Β Β Β Β 

print ("\nAlong none axis : \n", arr1)

Π’Ρ‹Ρ…ΠΎΠ΄:

Along first axis : 
 [[10  1]
 [12 15]]

Along first axis : 
 [[10 15]
 [ 1 12]]

Along none axis : 
 [ 1 10 12 15]

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ # 2: ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ индСксы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ отсортированный массив, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ argsort ()

import numpy as np

Β Β Β 

a = np.array([9, 3, 1, 7, 4, 3, 6])

Β Β Β 

print('Original array:\n', a)

Β Β Β 

b = np.argsort(a)

print('Sorted indices of original array->', b)

Β Β Β 

c = np.zeros(len(b), dtype = int)

for i in range(0, len(b)):

Β Β Β Β c[i]= a[b[i]]

print('Sorted array->', c)

Π’Ρ‹Ρ…ΠΎΠ΄:

Original array:
 [9 3 1 7 4 3 6]
Sorted indices of original array-> [2 1 5 4 6 3 0]
Sorted array-> [1 3 3 4 6 7 9]

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„– 3: ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΡƒΡŽ сортировку, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ.

import numpy as np

Β Β Β 

a = np.array([9, 3, 1, 3, 4, 3, 6])

Β Β Β 

b = np.array([4, 6, 9, 2, 1, 8, 7])Β 

print('column a, column b')

for (i, j) in zip(a, b):

Β Β Β Β print(i, ' ', j)

Β Β Β 

ind = np.lexsort((b, a))Β 

print('Sorted indices->', ind)

Π’Ρ‹Ρ…ΠΎΠ΄:

column a, column b
9   4
3   6
1   9
3   2
4   1
3   8
6   7
Sorted indices-> [2 3 1 5 4 6 0]

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹Π΅ посты:

Как ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив Numpy | ΠΏΠΈΡ‚ΠΎΠ½

0.00 (0%) 0 votes

numpy.argsort () Π² Python - GeeksforGeeks

numpy.argsort () Π² Python

numpy.argsort () Ѐункция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния косвСнной сортировки ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ оси с использованиСм Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом kind . Он Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив индСксов Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹, Ρ‡Ρ‚ΠΎ ΠΈ arr, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив.

Бинтаксис: numpy.argsort (arr, axis = -1, kind = ’quicksort’, order = None)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:
arr: [array_like] Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ массив.
ось: [int ΠΈΠ»ΠΈ None] Ось, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выполняСтся сортировка. Если Π½Π΅Ρ‚, массив выравниваСтся ΠΏΠ΅Ρ€Π΅Π΄ сортировкой. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ - -1, Ρ‡Ρ‚ΠΎ соотвСтствуСт послСднСй оси.
kind: [Β«quicksortΒ», Β«mergesortΒ», Β«heapsortΒ»] Алгоритм Π²Ρ‹Π±ΠΎΡ€Π°. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ «быстрая сортировка».
order: [str or list of str] Когда arr прСдставляСт собой массив с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ полями, этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ поля ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠ΅, Π²Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈ Ρ‚. Π”.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚: [index_array, ndarray] Массив индСксов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ arr ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ оси.Если arr ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ, Ρ‚ΠΎΠ³Π΄Π° arr [index_array] Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ отсортированный arr.

Код # 1:

import numpy as geek

in_rayar6 , 0 , 1 , 5 , 4 , 1 , 9 ] Β«Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ нСсортированный массив:Β» , in_arr)

out_arr = geek.argsort (in_arr)

print ( "Π˜Π½Π΄Π΅ΠΊΡΡ‹ отсортированного массива Π²Ρ‹Π²ΠΎΠ΄Π°:" , out_arr)

print ( "Π’Ρ‹Π²ΠΎΠ΄ отсортированного массива:" , out_arr]

Π’Ρ‹Ρ…ΠΎΠ΄:

Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ нСсортированный массив: [2 0 1 5 4 1 9]
ВывСсти индСксы отсортированного массива: [1 2 5 0 4 3 6]
Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ отсортированный массив: [0 1 1 2 4 5 9]
 

Код # 2:

import numpy as geek

in_arr = = = =массив ([[ 2 , 0 , 1 ], [ 5 , 4 , 3 000]] ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ( "Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ массив:" , in_arr)

out_arr1 = geek.argsort (in_arr, kind = 000 = 000 ' 0 )

print ( "Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ индСксы сортированного массива ΠΏΠΎ оси 0:" , out_arr1)

out_arr2 = geek. argsort (in_arr, kind = 'heapsort' , axis = 1 )

print ( "Π’Ρ‹Π²ΠΎΠ΄ сортированных индСксов массива ΠΏΠΎ оси 1:" )

Π’Ρ‹Ρ…ΠΎΠ΄:

Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ массив: [[2 0 1]
 [5 4 3]]
ВывСсти индСксы сортированного массива ΠΏΠΎ оси 0: [[0 0 0]
 [1 1 1]]
ВывСсти индСксы сортированного массива ΠΏΠΎ оси 1: [[1 2 0]
 [2 1 0]]
 

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‰ΠΈΠΊ! Π£ΠΊΡ€Π΅ΠΏΠΈΡ‚Π΅ свои основы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ курса Python Programming Foundation ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ основы.

Для Π½Π°Ρ‡Π°Π»Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΡŒΡ‚Π΅ΡΡŒ ΠΊ собСсСдованию. Π Π°ΡΡˆΠΈΡ€ΡŒΡ‚Π΅ свои ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ структур Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ курса Python DS . И Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ своС ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΠ΅ ΠΏΠΎ ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡŽ, ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΊ МашинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ - курс Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ уровня

python - Numpy argsort - Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚?

[2, 3, 1, 0] ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ наимСньший элСмСнт ΠΈΠΌΠ΅Π΅Ρ‚ индСкс 2, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ наимСньший элСмСнт - индСкс 3, Π·Π°Ρ‚Π΅ΠΌ индСкс 1, Π·Π°Ρ‚Π΅ΠΌ индСкс 0.

Π•ΡΡ‚ΡŒ нСсколько способов ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

  ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
ΠΈΠΌΠΏΠΎΡ€Ρ‚ scipy.статистика ΠΊΠ°ΠΊ статистика

def using_indexed_assignment (x):
    "https://stackoverflow.com/a/5284703/1 (Π‘Π²Π΅Π½ ΠœΠ°Ρ€Π½Π°Ρ…)"
    Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = np.empty (len (x), dtype = int)
    temp = x.argsort ()
    Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ [temp] = np.arange (len (x))
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

def using_rankdata (x):
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ stats.rankdata (x) -1

def using_argsort_twice (x):
    "https://stackoverflow.com/a/6266510/1 (k.rooijers)"
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ np.argsort (np.argsort (x))

def using_digitize (x):
    ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅_Π²Π°Π»Π»Ρ‹, индСкс = np.unique (x, return_inverse = True)
    Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½ΠΏ.digitize (x, bins = unique_val) - 1
  

НапримСр,

  Π’ [72]: x = np.array ([1.48,1.41,0.0,0.1])

Π’ [73]: using_indexed_assignment (x)
Π’Ρ‹Ρ…ΠΎΠ΄ [73]: массив ([3, 2, 0, 1])
  

Π­Ρ‚ΠΎ провСряСт, Ρ‡Ρ‚ΠΎ всС ΠΎΠ½ΠΈ Π΄Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

  x = np.random.random (10 ** 5)
ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ = using_indexed_assignment (x)
для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² (using_argsort_twice, using_digitize, using_rankdata):
    ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ np.allclose (оТидаСтся, func (x))
  

Π­Ρ‚ΠΈ тСсты IPython % timeit ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… массивов using_indexed_assignment - самый быстрый:

  Π’ [50]: x = np.random.random (10 ** 5)
Π’ [66]:% timeit using_indexed_assignment (x)
100 Ρ†ΠΈΠΊΠ»ΠΎΠ², Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· 3: 9,32 мс Π½Π° Ρ†ΠΈΠΊΠ»

Π’ [70]:% timeit using_rankdata (x)
100 Ρ†ΠΈΠΊΠ»ΠΎΠ², Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· 3: 10,6 мс Π½Π° Ρ†ΠΈΠΊΠ»

Π’ [56]:% timeit using_argsort_twice (x)
100 Ρ†ΠΈΠΊΠ»ΠΎΠ², Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· 3: 16,2 мс Π½Π° Ρ†ΠΈΠΊΠ»

Π’ [59]:% timeit using_digitize (x)
10 Ρ†ΠΈΠΊΠ»ΠΎΠ², Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· 3: 27 мс Π½Π° Ρ†ΠΈΠΊΠ»
  

Для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… массивов using_argsort_twice ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ быстрСС:

  Π’ [78]: x = np.random.random (10 ** 2)

Π’ [81]:% timeit using_argsort_twice (x)
100000 ΠΏΠ΅Ρ‚Π΅Π»ΡŒ, Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· 3: 3.45 мкс Π½Π° Ρ†ΠΈΠΊΠ»

Π’ [79]:% timeit using_indexed_assignment (x)
100000 ΠΏΠ΅Ρ‚Π΅Π»ΡŒ, Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· 3: 4,78 мкс Π½Π° ΠΏΠ΅Ρ‚Π»ΡŽ

Π’ [80]:% timeit using_rankdata (x)
100000 ΠΏΠ΅Ρ‚Π΅Π»ΡŒ, Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· 3: 19 мкс Π½Π° ΠΏΠ΅Ρ‚Π»ΡŽ

Π’ [82]:% timeit using_digitize (x)
10000 ΠΏΠ΅Ρ‚Π΅Π»ΡŒ, Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈΠ· 3: 26,2 мкс Π½Π° ΠΏΠ΅Ρ‚Π»ΡŽ
  

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ stats.rankdata Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ большС контроля Π½Π°Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ элСмСнты Ρ€Π°Π²Π½ΠΎΠ³ΠΎ значСния.

python - ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сортировку ΠΏΠΎ ΡƒΠ±Ρ‹Π²Π°Π½ΠΈΡŽ?

Если Π²Ρ‹ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ массив, самыС Π½ΠΈΠ·ΠΊΠΈΠ΅ элСмСнты становятся самыми высокими элСмСнтами, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, индСксы n Π²Ρ‹ΡΡˆΠΈΡ… элСмСнтов Ρ€Π°Π²Π½Ρ‹:

  (-avgDists) .argsort () [: n]
  

Π”Ρ€ΡƒΠ³ΠΎΠΉ способ Ρ€Π°ΡΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ ΠΎΠ± этом, ΠΊΠ°ΠΊ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² коммСнтариях, - это Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ большиС элСмСнты ΠΏΡ€ΠΈΠ±Ρ‹Π²Π°ΡŽΡ‚ послСдниС Π² argsort. Π˜Ρ‚Π°ΠΊ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· хвоста сортировки Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ n самых высоких элСмСнтов:

  avgDists.argsort () [:: - 1] [: n]
  

Оба ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠΌΠ΅ΡŽΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O (n log n) , ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² argsort являСтся здСсь Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠΌ.Но Ρƒ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ приятноС прСимущСство: ΠΎΠ½ замСняСт ΠΎΡ‚Ρ€ΠΈΡ†Π°Π½ΠΈΠ΅ массива O (n) Π½Π° срСз O (1) . Если Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с нСбольшими массивами Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ², Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, избСгая этого отрицания, Π° Ссли Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌΠΈ массивами, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π½Π° использовании памяти, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΡ‚Ρ€ΠΈΡ†Π°Π½ΠΈΠ΅ создаСт копию всСго массива.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π΅ всСгда Π΄Π°ΡŽΡ‚ эквивалСнтныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹: Ссли ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π°Ρ рСализация сортировки Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Π² argsort , e.Π³Ρ€Π°ΠΌΠΌ. ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова kind = 'mergesort' , Ρ‚ΠΎΠ³Π΄Π° пСрвая стратСгия сохранит ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ сортировки, Π½ΠΎ вторая стратСгия Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… элСмСнтов Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΉΠΌΠΈΠ½Π³Π°:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ нСбольшой массив ΠΈΠ· 100 ΠΏΠΎΠΏΠ»Π°Π²ΠΊΠΎΠ² ΠΈ Ρ…Π²ΠΎΡΡ‚ΠΎΠ²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π΄Π»ΠΈΠ½ΠΎΠΉ 30, ΠΌΠ΅Ρ‚ΠΎΠ΄ просмотра Π±Ρ‹Π» ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° 15% быстрСС

  >>> avgDists = np.random.rand (100)
>>> ΠΏ = 30
>>> timeit (-avgDists).argsort () [: n]
1,93 мкс Β± 6,68 нс Π½Π° Ρ†ΠΈΠΊΠ» (срСднСС Β± стандартноС ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ· 7 ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ², ΠΏΠΎ 1000000 Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ)
>>> timeit avgDists.argsort () [:: - 1] [: n]
1,64 мкс Β± 3,39 нс Π½Π° Ρ†ΠΈΠΊΠ» (срСднСС Β± стандартноС ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ· 7 ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ², ΠΏΠΎ 1000000 Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ)
>>> timeit avgDists.argsort () [- n:] [:: - 1]
1,64 мкс Β± 3,66 нс Π½Π° Ρ†ΠΈΠΊΠ» (срСднСС Β± стандартноС ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ· 7 ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ², ΠΏΠΎ 1000000 Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ)
  

Для массивов большСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΡ€Π΅ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ сортировка ΠΏΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ, ΠΈ Π½Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

  >>> avgDists = np.random.rand (1000)
>>> ΠΏ = 300
>>> timeit (-avgDists) .argsort () [: n]
21,9 мкс Β± 51,2 нс Π½Π° Ρ†ΠΈΠΊΠ» (срСднСС Β± стандартноС ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ· 7 ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ², 10000 Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ)
>>> timeit avgDists.argsort () [:: - 1] [: n]
21,7 мкс Β± 33,3 нс Π½Π° Ρ†ΠΈΠΊΠ» (срСднСС Β± стандартноС ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ· 7 ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ², 10000 Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ)
>>> timeit avgDists.argsort () [- n:] [:: - 1]
21,9 мкс Β± 37,1 нс Π½Π° Ρ†ΠΈΠΊΠ» (срСднСС Β± стандартноС ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ· 7 ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ², 10000 Ρ†ΠΈΠΊΠ»ΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ)
  

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΎΡ‚ nedim Π½ΠΈΠΆΠ΅ Π½Π΅Π²Π΅Ρ€Π΅Π½. УсСчСниС Π΄ΠΎ ΠΈΠ»ΠΈ послС рСвСрсирования Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ значСния для эффСктивности, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π΅ эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ массив, Π° Π½Π΅ фактичСски ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅.

numpy.argsort () Π² Python - Javatpoint

ΠœΠΎΠ΄ΡƒΠ»ΡŒ NumPy прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ argsort (), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ индСксы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ NumPy прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для выполнСния косвСнной сортировки ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ оси с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом. Π­Ρ‚Π° функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив индСксов Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹, Ρ‡Ρ‚ΠΎ ΠΈ 'a', ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сортируСт массив.

Бинтаксис

Ρ‚ΡƒΠΏΠΎΠΉ.argsort (a, axis = -1, kind = None, order = None)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

Π­Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ numpy.argsort ():

a: array_like

Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ опрСдСляСт исходный массив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

ось: int ΠΈΠ»ΠΈ None (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ)

Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ опрСдСляСт ось, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выполняСтся сортировка. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ось -1. Если ΠΌΡ‹ установим для этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ None, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ плоский массив.

kind: {'quicksort', 'mergesort', 'heapsort', 'stable'} (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ)

Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ опрСдСляСт Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ quicksort . И mergesort , ΠΈ stable ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π½ΡƒΡŽ сортировку. ЀактичСская рСализация Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ mergesort сохранСн для ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости.

Π·Π°ΠΊΠ°Π·: str ΠΈΠ»ΠΈ список str (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ)

Если 'a' - это массив с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ полями, этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ поля ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΈ Ρ‚. Π”.ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ строку, ΠΈ Π½Π΅ всС поля Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ. Но Π½Π΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ поля всС Ρ€Π°Π²Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² dtype, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΡ€Π²Π°Ρ‚ΡŒ связи.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚: index_array: ndarray, int

Π­Ρ‚Π° функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив индСксов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ Β«Π°Β» вмСстС с ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ осью. Если 'a' 1-D, [index_array] Π΄Π°Π΅Ρ‚ отсортированный 'a'. Π’ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅ΠΌ смыслС np.take_along_axis (arr1, index_array, axis = axis) всСгда Π΄Π°Π΅Ρ‚ отсортированный Β«aΒ», нСзависимо ΠΎΡ‚ размСрности.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1: np.argsort ()

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
a = np.array ([456,11,63])
Π°
b = np.argsort (Π°)
Π±

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅

  • ΠœΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ numpy с псСвдонимом np.
  • ΠœΡ‹ создали массив 'a' с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ np.array ().
  • ΠœΡ‹ объявили ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ 'b' ΠΈ присвоили Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ np.argsort ().
  • ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ массив 'a'.
  • НаконСц, ΠΌΡ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ вывСсти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ b.

Π’ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π±Ρ‹Π» ΠΏΠΎΠΊΠ°Π·Π°Π½ ndarray, содСрТащий индСксы (ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ элСмСнта для отсортированного массива) ΠΈ dtype.

Π’Ρ‹Ρ…ΠΎΠ΄:

массив ([456, 11, 63])
массив ([1, 2, 0], dtype = int64)
 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: Для Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива (сортировка ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ оси (Π²Π½ΠΈΠ·))

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
a = np.array ([[0, 5], [3, 2]])
индСксы = np.argsort (a, ось = 0)
индСксы

Π’Ρ‹Ρ…ΠΎΠ΄:

массив ([[0, 1],
       [1, 0]], dtype = int64)
 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3: Для Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива (Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° оси = 0)

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
a = np.array ([[0, 5], [3, 2]])
индСксы = np.argsort (a, ось = 0)
индСксы
np.take_along_axis (a, индСксы, ось = 0)

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅

  • ΠœΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ numpy с псСвдонимом np.
  • ΠœΡ‹ создали Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив Β«aΒ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ np.array ().
  • ΠœΡ‹ объявили индСксы ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ присвоили Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ np.argsort ().
  • ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив 'a' ΠΈ ось ΠΊΠ°ΠΊ 0.
  • Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ использовали Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ take_along_axis () ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ исходный массив, индСксы ΠΈ ось.
  • Π­Ρ‚Π° функция Π²Π΅Ρ€Π½ΡƒΠ»Π° отсортированный Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив.

На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π±Ρ‹Π» ΠΏΠΎΠΊΠ°Π·Π°Π½ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив с отсортированными элСмСнтами.

Π’Ρ‹Ρ…ΠΎΠ΄:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4: Для Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива (сортировка ΠΏΠΎ послСднСй оси (ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ))

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
a = np.array ([[0, 5], [3, 2]])
индСксы = np.argsort (a, ось = 1)
индСксы

Π’Ρ‹Ρ…ΠΎΠ΄:

массив ([[0, 1],
       [1, 0]], dtype = int64)
 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 5: Для Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива (Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° оси = 1)

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
а = нп.массив ([[0, 5], [3, 2]])
индСксы = np.argsort (a, ось = 1)
индСксы
np.take_along_axis (a, индСксы, ось = 1)

Π’Ρ‹Ρ…ΠΎΠ΄:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 6: Для массива N-D

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
a = np.array ([[0, 5], [3, 2]])
индСксы = np.unravel_index (np.argsort (a, axis = None), a.shape)
индСксы
a [индСксы] # Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ np.sort (a, axis = None)

Π’Ρ‹Ρ…ΠΎΠ΄:

(массив ([0, 1, 1, 0], dtype = int64), array ([0, 1, 0, 1], dtype = int64))
массив ([0, 2, 3, 5])
 

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅

  • ΠœΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ numpy с псСвдонимом np.
  • ΠœΡ‹ создали Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив Β«aΒ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ np.array ().
  • ΠœΡ‹ объявили ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ index ΠΈ присвоили Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ np.unravel_index ().
  • ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ np.argsort () ΠΈ Ρ„ΠΎΡ€ΠΌΡƒ массива 'a'.
  • ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив 'a' ΠΈ ось ΠΊΠ°ΠΊ 1 Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ argsort ().
  • Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ вывСсти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ индСксов ΠΈ [индСксы].

На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π±Ρ‹Π» ΠΏΠΎΠΊΠ°Π·Π°Π½ N-D массив с отсортированными элСмСнтами.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 7: Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
a = np.array ([(0, 5), (3, 2)], dtype = [('x', '

Π’Ρ‹Ρ…ΠΎΠ΄:

array ([(0, 5), (3, 2)], dtype = [('x', '

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅

  • ΠœΡ‹ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ numpy с псСвдонимом np.
  • ΠœΡ‹ создали Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив 'a' с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ np.array () с dtype = [('x', '
  • ΠœΡ‹ объявили ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ 'b' ΠΈ 'c' ΠΈ присвоили Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ np.argsort ().
  • ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ массив 'a' ΠΈ порядок Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.
  • НаконСц, ΠΌΡ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ вывСсти Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«bΒ» ΠΈ Β«cΒ».

Π’ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π±Ρ‹Π» ΠΏΠΎΠΊΠ°Π·Π°Π½ отсортированный массив с dtype = [('x', '


Python NumPy для вашСй Π±Π°Π±ΡƒΡˆΠΊΠΈ - 4.6 Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ NumPy sort () для сортировки элСмСнтов массива.

sort () ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ основных ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

  1. массив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ
  2. ось для сортировки - ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ -1, сортировка ΠΏΠΎ послСднСй оси
  3. , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² NumPy. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ NumPy Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ сортировку.

НапримСр, здСсь ΠΌΡ‹ создаСм 1d-массив, foo , Π° Π·Π°Ρ‚Π΅ΠΌ сортируСм Π΅Π³ΠΎ Π² порядкС возрастания.

  ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np

foo = np.array ([1, 7, 3, 9, 0, 9, 1])
np.sort (foo)
## массив ([0, 1, 1, 3, 7, 9, 9])
  

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ исходный массив остаСтся Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

  ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (foo)
## [1 7 3 9 0 9 1]
  

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСния foo Β«Π½Π° мСстС», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ .sort () ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° массива. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ссли Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ foo.sort () , Π½Π° этот Ρ€Π°Π· foo ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ свои значСния Π² отсортированном порядкС.

  foo.sort ()
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (foo)
## [0 1 1 3 7 9 9]
  

Если Ρƒ вас Π΅ΡΡ‚ΡŒ массив с Π½Π°Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… этому, sort () ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΈΡ… Π² ΠΊΠΎΠ½Π΅Ρ† массива.

  bar = np.array ([5, np.nan, 3, 11])
np.sort (Π±Π°Ρ€)
## массив ([3., 5., 11., nan])
  

К соТалСнию, Π² NumPy Π½Π΅Ρ‚ простого ΠΈ прямого способа сортировки массивов Π² порядкС убывания. Однако, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π², ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ. Особо Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ - ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив Π² порядкС возрастания, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

  np.sort (bar) [:: - 1]
## array ([nan, 11., 5., 3.])
  

Π’Ρ‚ΠΎΡ€ΠΎΠΉ - ΠΎΡ‚Ρ€ΠΈΡ†Π°Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ массива, сортировка ΠΈΡ… Π² порядкС возрастания, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΡ‚Ρ€ΠΈΡ†Π°Π½ΠΈΠ΅ этого Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

  -np.sort (-bar)
## массив ([11., 5., 3., nan])
  

ОсновноС Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ этими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ 1-ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚ Π½Π°Π½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½ массива, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π½Π°Π½ с Π½Π° Π·Π°Π΄Π½ΠΈΠΉ ΠΏΠ»Π°Π½.ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со строками, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚ΡŒ строку.

Π§Ρ‚ΠΎ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив Π²ΠΎΡ‚ Ρ‚Π°ΠΊ?

  boo = np.array ([
    [55, 10, 12],
    [20, 0, 33],
    [55, 92, 3]
])
  

Π’ этом случаС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ axis Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sort () , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ оси Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сортировку. НапримСр, Ссли ΠΌΡ‹ выполняСм np.sort (boo, axis = 0) , ΠΎΠ½ сортируСт boo ΠΏΠΎ оси 0.Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΎΠ½ сортируСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ столбСц boo .

  np.sort (boo, axis = 0)
## массив ([[20, 0, 3],
## [55, 10, 12],
## [55, 92, 33]])
  

И Ссли ΠΌΡ‹ выполняСм np.sort (boo, axis = 1) , ΠΎΠ½ сортируСт boo ΠΏΠΎ оси 1. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΎΠ½ сортируСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку ΠΈΠ· boo .

  np.sort (boo, axis = 1)
## массив ([[10, 12, 55],
## [0, 20, 33],
## [3, 55, 92]])
  

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ axis = -1 , Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ NumPy, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ послСднюю ось массива.Π’ этом случаС это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° сортировку boo ΠΏΠΎ оси 1.

  np.sort (a = boo, axis = -1)
## массив ([[10, 12, 55],
## [0, 20, 33],
## [3, 55, 92]])
  

ΠšΡ€ΡƒΡ‚ΠΎ, Π½ΠΎ Ρ‡Ρ‚ΠΎ, Ссли Π±Ρ‹ ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строки boo Π² соотвСтствии, скаТСм, со значСниями Π² 1-ΠΌ столбцС? Если Π±Ρ‹ Ρƒ нас Π±Ρ‹Π»ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ Π΄Π°Ρ‚ΡŒ Π½Π°ΠΌ массив [1, 0, 2] , ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ это Π² индСкс строки ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ отсортированный массив.

  Π±Ρƒ [[1, 0, 2]]
## массив ([[20, 0, 33],
## [55, 10, 12],
## [55, 92, 3]])
  

Нам Π½ΡƒΠΆΠ΅Π½ инструмСнт argsort () . argsort () Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ sort () , Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив ΠΈΠ· индСксов , ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ массива Π² отсортированном случаС.

НапримСр, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ массив [3, 0, 10, 5] ΠΈ Π²Ρ‹ Π²Ρ‹Π·Π²Π°Π»ΠΈ для Π½Π΅Π³ΠΎ argsort () , Π²Ρ‹ Π²Π΅Ρ€Π½Π΅Ρ‚Π΅ массив [1, 0, 3, 2] , ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ наимСньший элСмСнт ΠΈΠΌΠ΅Π΅Ρ‚ индСкс 1, Π²Ρ‚ΠΎΡ€ΠΎΠΉ наимСньший элСмСнт ΠΈΠΌΠ΅Π΅Ρ‚ индСкс 0 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Если Π±Ρ‹ Π²Ρ‹ использовали этот массив для индСксации исходного массива, Π²Ρ‹ Π±Ρ‹ Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ отсортированный массив, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Π²Ρ‹ Π²Ρ‹Π·Π²Π°Π»ΠΈ np.Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° () .

  goo = np.array ([3, 0, 10, 5]) # [3, 0, 10, 5]
np.argsort (goo) # [1, 0, 3, 2]
## массив ([1, 0, 3, 2])
goo [np.argsort (goo)] # [0, 3, 5 10]
## массив ([0, 3, 5, 10])
  

Π˜Ρ‚Π°ΠΊ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строки Π΄Π²ΡƒΡ…ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива Π½Π° основС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ столбца, Π²Π°ΠΌ просто Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ argsort () для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ этого столбца ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ для Π²Ρ‹Π±ΠΎΡ€Π° строк ΠΈΠ· исходного массива.

ΠžΠ³Π»ΡΠ΄Ρ‹Π²Π°ΡΡΡŒ Π½Π° наш Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив boo , ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ строки ΠΏΠΎ 1-ΠΌΡƒ столбцу Π² порядкС возрастания.

  Π±Ρƒ [np.argsort (boo [:, 0])]
## массив ([[20, 0, 33],
## [55, 10, 12],
## [55, 92, 3]])
  

Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π²Π°ΠΆΠ½Ρ‹ΠΉ вопрос. Если Π² нашСм массивС Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ значСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 55 Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΡ… сортировка Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ порядок, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² исходном массивС? НапримСр, ΠΎΠ±Π΅ эти ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ допустимыми Ρ‚ΠΈΠΏΠ°ΠΌΠΈ boo ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ столбцу, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ пСрвая ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π½Π΅ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Π΅Ρ‚ порядок 55.

  ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Π±Ρƒ [[1, 0, 2]])
## [[20 0 33]
## [55 10 12]
## [55 92 3]]
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Π±Ρƒ [[1, 2, 0]])
## [[20 0 33]
## [55 92 3]
## [55 10 12]]
  

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки .По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ np.sort () ΠΈ np.argsort Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, установив kind = ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ .


Π£Ρ‡Π΅Π±Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½ курса

  1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅
    1.1 Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅
  2. Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» для массива
    2.1 ΠœΠΎΡ‚ΠΈΠ²Π°Ρ†ΠΈΡ для массива NumPy
    2.2 ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с массивами NumPy
    2.3 БозданиС массивов NumPy
    2.4 Π˜Π½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… массивов
    2.5 Π˜Π½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… массивов
    2.6 Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ матСматичСскиС вычислСния для массивов
    2.Π’Ρ‹Π·ΠΎΠ² 7: воссоСдинСниС срСднСй ΡˆΠΊΠΎΠ»Ρ‹
    2.8 Π’Ρ‹Π·ΠΎΠ²: Π·ΠΎΠ»ΠΎΡ‚ΠΎΠΈΡΠΊΠ°Ρ‚Π΅Π»ΡŒ
    2.9 Π’Ρ‹Π·ΠΎΠ²: Chic-fil-A
  3. Intermediate Array Stuff
    3.1 Broadcasting
    3.2 newaxis
    3.3 reshape ()
    3.4 ЛогичСскоС индСксированиС
    3.5 nan
    3.6 infinity
    3.7 random
    3.8 Challenge: Love Distance
    3.9 Challenge: Professor Prick
    3.10 Challenge: Psycho Parent
  4. ΠžΠ±Ρ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
    4.1 Π³Π΄Π΅ ()
    4.2 ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
    4.3 всС () ΠΈ Π»ΡŽΠ±Ρ‹Π΅ ()
    4,4 concatenate ()
    4,5 Π‘Ρ‚Π΅ΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
    4,6 Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°
    4,7 ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ()
    4,8 Π—Π°Π΄Π°Ρ‡Π°: Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ²
    4,9 Π—Π°Π΄Π°Ρ‡Π°: Big Fish
    4,10 Π—Π°Π΄Π°Ρ‡Π°: Taco Truck
  5. Advanced Array Stuff
    5.1 Advanced Array Indexing
    5.2 View vs Copy
    5.3 Challenge: Population Verification
    5.4 Challenge: Prime Locations
    5.5 Challenge: The Game of Doors
    5.6 Challenge: Peanut Butter
  6. Π€ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ босс
    6.1 as_strided ()
    6.2 einsum ()
    6.3 Π—Π°Π΄Π°Ρ‡Π°: One-Hot-Encoding
    6.4 Π—Π°Π΄Π°Ρ‡Π°: Π‘ΡƒΠΌΠΌΠ°Ρ€Π½ΠΎΠ΅ количСство осадков
    6.5 Π—Π°Π΄Π°Ρ‡Π°: ΠΠ°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ тСннис
    6.6 Π—Π°Π΄Π°Ρ‡Π°: Π“Π΄Π΅ Π£ΠΎΠ»Π΄ΠΎ
    6.7 Π—Π°Π΄Π°Ρ‡Π°: Π’Π½Π΅ΡˆΠ½ΠΈΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚

3 простых ΠΌΠ΅Ρ‚ΠΎΠ΄Π° сортировки Π² NumPy

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ! Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ остановимся Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… сортировки 3 Π² NumPy .

Π˜Ρ‚Π°ΠΊ, приступим! πŸ™‚

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python NumPy ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π½Π°ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для создания массива ΠΈ управлСния элСмСнтами Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² структурС массива.Наряду с этим NumPy ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π½Π°ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π½Π°ΠΌ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² структурС массива.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ сортировки Π² NumPy

ΠœΡ‹ ΠΈΠ·ΡƒΡ‡ΠΈΠΌ Π½ΠΈΠΆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ сортировки Π² NumPy.

  1. Ѐункция NumPy sort ()
  2. Ѐункция NumPy argsort ()
  3. Ѐункция NumPy lexsort ()

Π˜Ρ‚Π°ΠΊ, приступим!

1. Ѐункция NumPy sort ()

Для сортировки Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… элСмСнтов, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² структурС массива, NumPy прСдоставляСт Π½Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sort () .Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sort () ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈΡ… Π² порядкС возрастания ΠΈ убывания соотвСтствСнно.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° синтаксис Π½ΠΈΠΆΠ΅!

Бинтаксис:

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ «ось» ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ способ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ сортировка. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ устанавливаСм axis = NONE, сортировка происходит Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ массив прСдставляСт собой ΠΎΠ΄Π½Ρƒ строку элСмСнтов. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли ΠΌΡ‹ устанавливаСм axis = 1, сортировка происходит построчно, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ каТдая строка сортируСтся ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1:

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создали массив, Π΄Π°Π»Π΅Π΅ ΠΌΡ‹ отсортировали массив с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sort () ΠΈ с осью = NONE , Ρ‚.Π΅. ΠΎΠ½ сортируСт элСмСнты Π² порядкС возрастания.

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
data = np.array ([[22, 55], [0, 10]])
res = np.sort (Π΄Π°Π½Π½Ρ‹Π΅, ось = НСт)
print ("Π”Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄ сортировкой:", data)
print ("Π”Π°Π½Π½Ρ‹Π΅ послС сортировки:", res)
 

Π’Ρ‹Ρ…ΠΎΠ΄:

Π”Π°Π½Π½Ρ‹Π΅ Π΄ΠΎ сортировки: [[22 55]
 [0 10]]
Π”Π°Π½Π½Ρ‹Π΅ послС сортировки: [0 10 22 55]
 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2:

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создали массив ΠΈ отсортировали Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sort (), здСсь ΠΌΡ‹ установили axis = 1 i.Π΅. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° построчная сортировка.

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
data = np.array ([[66, 55, 22], [0, 10, -1]])
res = np.sort (Π΄Π°Π½Π½Ρ‹Π΅, ось = 1)
print ("Π”Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄ сортировкой:", data)
print ("Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ строкам:", res)
 

Π’Ρ‹Ρ…ΠΎΠ΄:

Π”Π°Π½Π½Ρ‹Π΅ Π΄ΠΎ сортировки: [[66 55 22]
 [0 10 -1]]
Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ строкам: [[22 55 66]
 [-1 0 10]]
 

2. NumPy argsort ()

Помимо ΠΌΠ΅Ρ‚ΠΎΠ΄Π° sort (), Ρƒ нас Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ функция argsort () , которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² сортировки Π² NumPy, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив ΠΈΠ· индСксов отсортированных элСмСнтов.Из этих отсортированных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ индСкса ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ отсортированныС элСмСнты массива Π² порядкС возрастания.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ argsort () ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСния массива ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ значСния индСксов Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ самого, Ρ‡Ρ‚ΠΎ ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ массив.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
data = np.array ([66, 55, 22,11, -1,0,10])
res_index = np.argsort (Π΄Π°Π½Π½Ρ‹Π΅)
print ("Π”Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄ сортировкой:", data)
print ("ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ значСния индСкса массива:", res_index)

x = np.zeros (len (res_index), dtype = int)
для i в диапазонС (0, len (x)):
    x [i] = Π΄Π°Π½Π½Ρ‹Π΅ [res_index [i]]
print ('ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ массив ΠΈΠ· индСксов:', x)
 

Π’Ρ‹Π²ΠΎΠ΄:

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ argsort () для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ отсортированныС значСния индСксов элСмСнтов.ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ использовали Ρ‚Π΅ ΠΆΠ΅ значСния индСкса массива, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ отсортированныС элСмСнты массива.

Π”Π°Π½Π½Ρ‹Π΅ Π΄ΠΎ сортировки: [66 55 22 11 -1 0 10]
ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ значСния индСкса массива: [4 5 6 3 2 1 0]
ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ массив ΠΏΠΎ индСксам: [-1 0 10 11 22 55 66]
 

3. Ѐункция lexsort () NumPy

Ѐункция lexsort () позволяСт Π½Π°ΠΌ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСния Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎ столбцам. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lexsort () ΠΌΡ‹ сортируСм Π΄Π²Π° массива, принимая Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ.Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ значСния индСксов отсортированных элСмСнтов.

ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np
data = np.array ([66, 55, 22,11, -1,0,10])
data1 = np.array ([1,2,3,4,5,0, -1])
res_index = np.lexsort ((Π΄Π°Π½Π½Ρ‹Π΅1, Π΄Π°Π½Π½Ρ‹Π΅))
print ("ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ значСния индСкса массива:", res_index)
 

Π’Ρ‹Ρ…ΠΎΠ΄:

ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ значСния индСкса массива: [4 5 6 3 2 1 0]
 

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

НС ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΈΠΆΠ΅, Ссли Ρƒ вас Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ вопросы. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ большС Ρ‚Π°ΠΊΠΈΡ… сообщСний, связанных с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π° Python, ΠΎΡΡ‚Π°Π²Π°ΠΉΡ‚Π΅ΡΡŒ с Π½Π°ΠΌΠΈ.

Π”ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ обучСния !!

ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сортировку Π² NumPy

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΊΠ½ΠΈΠ³Ρƒ Π½Π° своСй ΠΊΠ½ΠΈΠΆΠ½ΠΎΠΉ ΠΏΠΎΠ»ΠΊΠ΅. ΠšΠ°ΠΊΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π²Ρ‹ Π±Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π»ΠΈ: A) ваша книТная ΠΏΠΎΠ»ΠΊΠ° содСрТит всС ваши ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌ порядкС, ΠΈΠ»ΠΈ B) ваша книТная ΠΏΠΎΠ»ΠΊΠ° содСрТит всС ΠΊΠ½ΠΈΠ³ΠΈ, отсортированныС Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС ΠΏΠΎ названию.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π‘) сэкономит Π²Π°ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, особСнно Ссли Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ своСй ΠΊΠ½ΠΈΠΆΠ½ΠΎΠΉ ΠΏΠΎΠ»ΠΊΠ΅ нСсколько Ρ€Π°Π·. Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π²Π°ΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сортировку Π² ΠΎΠ΄Π½ΠΎΠΉ строкС Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy.Π‘Ρ‚Π°Ρ‚ΡŒΡ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎ основана Π½Π° Π³Π»Π°Π²Π°Ρ… ΠΈΠ· ΠΌΠΎΠ΅ΠΉ ΠΊΠ½ΠΈΠ³ΠΈ Β«Coffee Break NumPyΒ» ΠΈ ΠΌΠΎΠ΅ΠΉ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΉ ΠΊΠ½ΠΈΠ³ΠΈ Β«Python One-linersΒ». 😊

ΠžΡΠ½ΠΎΠ²Ρ‹

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π»Π΅ΠΆΠΈΡ‚ Π² основС Π±ΠΎΠ»Π΅Π΅ слоТных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ коммСрчСскиС вычислСния, ΠΎΠ±Ρ…ΠΎΠ΄ Π³Ρ€Π°Ρ„ΠΎΠ² ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ поиска. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, NumPy прСдоставляСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ поиска - Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся популярным Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ «Быстрая сортировка». Однако для этого однострочника ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ высокого уровня, рассматривая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сортировки ΠΊΠ°ΠΊ Β«Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ ящик», ΠΊΡƒΠ΄Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ массив NumPy ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ отсортированный массив NumPy.

Π½Π° рисункС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ нСсортированный массив [10, 6, 8, 2, 5, 4,
9, 1] Π² отсортированный массив [1, 2, 4, 5, 6, 8, 9, 10]. Π­Ρ‚ΠΎ Ρ†Π΅Π»ΡŒ
Ѐункция sort () Π² NumPy.

Но
Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π²Π°ΠΆΠ½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сам массив, Π½ΠΎ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ
массив индСксов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ нСсортированный массив Π² отсортированный
мноТСство. НапримСр, элСмСнт массива Β«1Β» нСсортированного массива ΠΈΠΌΠ΅Π΅Ρ‚ индСкс Β«7Β». Π‘
элСмСнт массива Β«1Β» - это ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт отсортированного массива, Π΅Π³ΠΎ индСкс Β«7Β»
- ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт отсортированных индСксов.Π­Ρ‚ΠΎ Ρ†Π΅Π»ΡŒ argsort () Π² NumPy.
функция.

Π­Ρ‚ΠΎΡ‚ нСбольшой Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° дСмонстрируСт, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ sort () ΠΈ argsort () Π² NumPy:

 import numpy as np


a = np.array ([10, 6, 8, 2, 5, 4, 9, 1])

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (np.sort (a))
# [1 2 4 5 6 8 9 10]

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (np.argsort (a))
# [7 3 5 4 1 2 6 0] 

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ: Ρ‡Π΅ΠΌ функция sort () Π² NumPy отличаСтся ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sorted () Π² Python? ΠžΡ‚Π²Π΅Ρ‚ прост: Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ NumPy для сортировки ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹Ρ… массивов!

На рисункС ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π΄Π²Π° способа использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сортировки для сортировки Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива.Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ массив ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ оси: ось 0 (строки) ΠΈ ось 1 (столбцы). Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ сортировку ΠΏΠΎ оси 0 (сортировка ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ) ΠΈΠ»ΠΈ ΠΏΠΎ оси 1 (сортировка ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ). Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово axis опрСдСляСт Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ выполняСтС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ NumPy. Π’ΠΎΡ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ тСхничСски ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ:

 import numpy as np


a = np.array ([[1, 6, 2],
              [5, 1, 1],
              [8, 0, 1]])

print (np.sort (a, ось = 0))
"" "
[[1 0 1]
 [5 1 1]
 [8 6 2]]
"" "

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (Π½ΠΏ.sort (a, axis = 1))
"" "
[[1 2 6]
 [1 1 5]
 [0 1 8]]
"" "
 

ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ оси ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π²Π°ΠΌ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив NumPy
ΠΏΠΎ фиксированному Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ. Π­Ρ‚ΠΎ основная сила Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sort () NumPy ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с
ΠΊ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Python sorted ().

Код

ΠžΠ΄Π½ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½ΠΈΠΊ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ: «Найти ΠΈΠΌΠ΅Π½Π° Ρ‚Ρ€Π΅Ρ… Π»ΡƒΡ‡ΡˆΠΈΡ… учащихся с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌΠΈ Π±Π°Π»Π»Π°ΠΌΠΈ ΠΏΠΎ SATΒ». ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ простая сортировка массива Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² SAT Π½Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π·Π°Π΄Π°Ρ‡Π΅ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π° учащихся.Π‘Π½Π°Ρ‡Π°Π»Π° посмотритС Π΄Π°Π½Π½Ρ‹Π΅, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ однострочноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

 ## Зависимости
ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ numpy ΠΊΠ°ΠΊ np


## Π”Π°Π½Π½Ρ‹Π΅: Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ SAT для Ρ€Π°Π·Π½Ρ‹Ρ… студСнтов
sat_scores = np.array ([1100, 1256, 1543, 1043, 989, 1412, 1343])
student = np.array ([Β«Π”ΠΆΠΎΠ½Β», Β«Π‘ΠΎΠ±Β», «Алиса», Β«Π”ΠΆΠΎΒ», Β«Π”ΠΆΠ΅ΠΉΠ½Β», «Ѐрэнк», Β«ΠšΠ°Ρ€Π»Β»])


## Один Π»Π°ΠΉΠ½Π΅Ρ€
top_3 = студСнты [np.argsort (sat_scores)] [: 3: -1]


## Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (top_3)
 

Π§Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ этот Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°?

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ΄ опрСдСляСт Π΄Π°Π½Π½Ρ‹Π΅
состоящий ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² SAT студСнтов Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ
Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π½Π° этих студСнтов.НапримСр, ΡƒΡ‡Π΅Π½ΠΈΠΊ Β«Π”ΠΆΠΎΠ½Β» сдал SAT.
ΠΎΡ†Π΅Π½ΠΊΠ° Β«1100Β», Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Β«Π€Ρ€Π°Π½ΠΊΒ» ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΎΡ†Π΅Π½ΠΊΡƒ SAT Β«1343Β».

Вопрос Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΈΠΌΠ΅Π½Π°
Ρ‚Ρ€ΠΎΠ΅ самых ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹Ρ… студСнтов. ΠžΠ΄Π½ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½ΠΈΠΊ достигаСт этой Ρ†Π΅Π»ΠΈ - Π½Π΅ Π·Π° счСт
просто сортировка Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² SAT - Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ argsort (). ΠžΡ‚Π·Ρ‹Π²Π°Ρ‚ΡŒ
Ρ‡Ρ‚ΠΎ функция argsort () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив индСксов, Ρ‚Π°ΠΊΠΎΠΉ Ρ‡Ρ‚ΠΎ
ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты массива Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠ΄ΡƒΡ‚ отсортированы.

Π’ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ argsort ΠΎΡ†Π΅Π½ΠΎΠΊ SAT:

 print (np.argsort (sat_scores))
# [4 3 0 1 6 5 2]
 

ΠŸΠΎΡ‡Π΅ΠΌΡƒ индСкс Β«4Β» стоит Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ
ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π°? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ студСнтки Β«Π”ΠΆΠ΅ΠΉΠ½Β» самый Π½ΠΈΠ·ΠΊΠΈΠΉ Π±Π°Π»Π» ΠΏΠΎ SAT - 989
Ρ‚ΠΎΡ‡ΠΊΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊ sort (), Ρ‚Π°ΠΊ ΠΈ argsort () ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ ΠΎΡ‚
ΠΎΡ‚ самых Π½ΠΈΠ·ΠΊΠΈΡ… Π΄ΠΎ самых высоких Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π£ вас Π΅ΡΡ‚ΡŒ отсортированныС индСксы, Π½ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ? ИдСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… студСнтов. Π’Π΅ΠΏΠ΅Ρ€ΡŒ этого ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΈΠ½Π΄Π΅ΠΊΡΠ°Ρ†ΠΈΡŽ Π² массивС ΠΈΠΌΠ΅Π½ учащихся:

 print (student [np.argsort (sat_scores)])
# ['Π”ΠΆΠ΅ΠΉΠ½' Π”ΠΆΠΎ 'Π”ΠΆΠΎΠ½' Π‘ΠΎΠ± 'ΠšΠ°Ρ€Π»' Ѐрэнк 'Алиса']
 

Π’Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ Β«Π”ΠΆΠ΅ΠΉΠ½Β» самый Π½ΠΈΠ·ΠΊΠΈΠΉ Π±Π°Π»Π» Π·Π° SAT, Π° Ρƒ «Алисы» самый высокий Π±Π°Π»Π» Π·Π° SAT.ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ этот список (ΠΎΡ‚ самого высокого Π΄ΠΎ самого Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ) ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Ρ‚Ρ€Π΅Ρ… Π»ΡƒΡ‡ΡˆΠΈΡ… ΡƒΡ‡Π΅Π½ΠΈΠΊΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ срСзку:

 ## ΠžΠ΄Π½ΠΎΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹ΠΉ
top_3 = студСнты [np.argsort (sat_scores)] [: 3: -1]


## Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (top_3)
# ['Alice' 'Frank' 'Carl'] 

Алиса, Ѐрэнк ΠΈ ΠšΠ°Ρ€Π» - студСнты с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌΠΈ Π±Π°Π»Π»Π°ΠΌΠΈ SAT 1543, 1412 ΠΈ 1343 соотвСтствСнно.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ дальшС?

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ ΡΡ‚Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠΈΠΌ программистом (ΠΈ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ своС слабоС «я»), я создал свой курс элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ для постоянного ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡ Python.Мои ΠΊΠ½ΠΈΠ³ΠΈ Β«Python для ΠΊΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊΠΎΠ²Β» ΠΈ Β«Coffee Break NumPyΒ» основаны Π½Π° этой философии Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹Ρ… ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ (КайдзСн) с использованиСм ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡŽ, основанного Π½Π° Π³ΠΎΠ»ΠΎΠ²ΠΎΠ»ΠΎΠΌΠΊΠ°Ρ…. Π­Ρ‚ΠΎ вСсСло!

Работая исслСдоватСлСм распрСдСлСнных систСм, Π΄ΠΎΠΊΡ‚ΠΎΡ€ ΠšΡ€ΠΈΡΡ‚ΠΈΠ°Π½ ΠœΠ°ΠΉΠ΅Ρ€ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» свою любовь ΠΊ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡŽ студСнтов, ΠΈΠ·ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΡƒ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠΎΡ‡ΡŒ студСнтам Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π±ΠΎΠ»Π΅Π΅ высокого уровня успСха Π² Python, ΠΎΠ½ основал Π²Π΅Π±-сайт ΠΏΠΎ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Finxter.com. Он являСтся Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ популярной ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Python One-Liners (NoStarch 2020), соавтором сСрии самоизданных ΠΊΠ½ΠΈΠ³ ΠΎ Python для ΠΊΠΎΡ„Π΅-Π±Ρ€Π΅ΠΉΠΊΠΎΠ², энтузиаст ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠΈ, фрилансСр ΠΈ Π²Π»Π°Π΄Π΅Π»Π΅Ρ† ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· 10 ΠΊΡ€ΡƒΠΏΠ½Π΅ΠΉΡˆΠΈΡ… Π±Π»ΠΎΠ³ΠΎΠ² Python ΠΏΠΎ всСму ΠΌΠΈΡ€Ρƒ.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *