programing

Numpy argsort - 그것은 무엇을 하고 있습니까?

lastmoon 2023. 6. 26. 21:35
반응형

Numpy argsort - 그것은 무엇을 하고 있습니까?

왜 numpy가 이런 결과를 주는가:

x = numpy.array([1.48,1.41,0.0,0.1])
print x.argsort()

>[2 3 1 0]

이런 일을 할 것이라고 예상했을 때:

[3 2 0 1]

분명히 그 기능에 대한 나의 이해가 부족합니다.

문서에 따르면

배열을 정렬할 인덱스를 반환합니다.

  • 2의 인덱스입니다.0.0.
  • 3의 인덱스입니다.0.1.
  • 1의 인덱스입니다.1.41.
  • 0의 인덱스입니다.1.48.

[2, 3, 1, 0]가장 작은 요소가 인덱스 2, 다음으로 작은 요소가 인덱스 3, 다음으로 인덱스 1, 다음으로 인덱스 0에 있음을 나타냅니다.

원하는 결과를 얻을 수 있는 여러 가지 방법이 있습니다.

import numpy as np
import scipy.stats as stats

def using_indexed_assignment(x):
    "https://stackoverflow.com/a/5284703/190597 (Sven Marnach)"
    result = np.empty(len(x), dtype=int)
    temp = x.argsort()
    result[temp] = np.arange(len(x))
    return result

def using_rankdata(x):
    return stats.rankdata(x)-1

def using_argsort_twice(x):
    "https://stackoverflow.com/a/6266510/190597 (k.rooijers)"
    return np.argsort(np.argsort(x))

def using_digitize(x):
    unique_vals, index = np.unique(x, return_inverse=True)
    return np.digitize(x, bins=unique_vals) - 1

예를들면,

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

In [73]: using_indexed_assignment(x)
Out[73]: array([3, 2, 0, 1])

이렇게 하면 모두 동일한 결과를 얻을 수 있는지 확인합니다.

x = np.random.random(10**5)
expected = using_indexed_assignment(x)
for func in (using_argsort_twice, using_digitize, using_rankdata):
    assert np.allclose(expected, func(x))

이 아이피톤들%timeit벤치마크를 통해 대규모 어레이에 대해 제안됨using_indexed_assignment가장 빠름:

In [50]: x = np.random.random(10**5)
In [66]: %timeit using_indexed_assignment(x)
100 loops, best of 3: 9.32 ms per loop

In [70]: %timeit using_rankdata(x)
100 loops, best of 3: 10.6 ms per loop

In [56]: %timeit using_argsort_twice(x)
100 loops, best of 3: 16.2 ms per loop

In [59]: %timeit using_digitize(x)
10 loops, best of 3: 27 ms per loop

소규모 어레이의 경우using_argsort_twice더 빠를 수 있습니다.

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

In [81]: %timeit using_argsort_twice(x)
100000 loops, best of 3: 3.45 µs per loop

In [79]: %timeit using_indexed_assignment(x)
100000 loops, best of 3: 4.78 µs per loop

In [80]: %timeit using_rankdata(x)
100000 loops, best of 3: 19 µs per loop

In [82]: %timeit using_digitize(x)
10000 loops, best of 3: 26.2 µs per loop

또한 이를 통해 동일한 값의 요소를 처리하는 방법을 보다 효과적으로 제어할 수 있습니다.

문서에 나와 있듯이,argsort:

배열을 정렬할 인덱스를 반환합니다.

즉, Argsort의 첫 번째 요소는 먼저 정렬해야 하는 요소의 인덱스이고, 두 번째 요소는 두 번째 요소의 인덱스입니다.

당신이 원하는 것은 값의 순위 순서입니다. 이것은 에서 제공하는 것입니다. 순위에 동점이 있을 경우 어떤 일이 발생할지 생각해 볼 필요가 있습니다.

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

배열을 정렬할 인덱스를 반환합니다.

kind 키워드로 지정된 알고리즘을 사용하여 지정된 축을 따라 간접 정렬을 수행합니다.지정된 축을 따라 인덱스 데이터와 동일한 모양의 인덱스 배열을 정렬된 순서로 반환합니다.

다음과 같은 값 목록을 갖는 파이썬의 한 예를 생각해 보십시오.

listExample  = [0 , 2, 2456,  2000, 5000, 0, 1]

이제 argsort 함수를 사용합니다.

import numpy as np
list(np.argsort(listExample))

출력은 다음과 같습니다.

[0, 5, 6, 1, 3, 2, 4]

다음은 목록에 있는 값의 인덱스 목록입니다. 예: 이 인덱스를 각 값에 매핑하면 다음과 같은 결과가 나타납니다.

[0, 0, 1, 2, 2000, 2456, 5000]

(저는 이 기능이 많은 곳에서 매우 유용하다고 생각합니다.목록/배열을 정렬하고 싶지만 list.sort() 함수를 사용하지 않으려면(즉, 목록의 실제 값 순서를 변경하지 않고) 이 함수를 사용할 수 있습니다.

자세한 내용은 다음 링크를 참조하십시오. https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.argsort.html

선택사항:
를 npnumpy로
=x = np.array([1.48,1.41,0.0,0.1])
() x.argsort () ()argsort ()

선택 사항:
1는 ([3, 2, 0, 1])입니다.

"왜 argsort"를 궁금해하는 사람은 "한 배열을 사용하여 다른 배열을 정렬"하는 것이 좋습니다.

In [49]: a = np.array(list('asdf'))

In [50]: b = [3,2,0,1]

In [51]: np.argsort(b)
Out[51]: array([2, 3, 1, 0])

In [52]: a[np.argsort(b)]
Out[52]: array(['d', 'f', 's', 'a'], dtype='<U1')

이것은 이름 열 및 급여 열과 같은 열 데이터에 적합하며, N개의 가장 높은 급여를 받는 사람의 이름을 확인하려고 합니다.

먼저, 배열을 주문했습니다.그런 다음 배열의 초기 인덱스를 사용하여 배열을 생성합니다.

np.argsort는 정렬 알고리즘 유형을 지정하는 'kind'에 의해 지정된 정렬 배열의 인덱스를 반환합니다.그러나 목록을 np.argmax와 함께 사용하면 목록에서 가장 큰 요소의 인덱스를 반환합니다.np.sort는 지정된 배열 목록을 정렬합니다.

단지 OP의 원래 이해와 코드를 사용한 실제 구현을 직접 대조하고 싶을 뿐입니다.

numpy.argsort어레이에 다음과 됩니다.

x[x.argsort()] == numpy.sort(x) # this will be an array of True's

OP는 원래 1D 어레이에 대해 다음과 같이 정의된다고 생각했습니다.

x == numpy.sort(x)[x.argsort()] # this will not be True

참고: 이 코드는 일반적인 경우에는 작동하지 않습니다(1D에서만 작동함). 이 대답은 순전히 설명을 위한 것입니다.

인덱스에 합니다.[1.48,1.41,0.0,0.1],즉, 다음을 의미합니다.0.0는 색인 [2]의 첫 번째 요소입니다. 0.1인덱스[3]의 두 번째 요소입니다. 1.41는 색인 [1]의 세 번째 요소입니다. 1.48인덱스[0]의 네 번째 요소입니다.출력:

[2,3,1,0]

언급URL : https://stackoverflow.com/questions/17901218/numpy-argsort-what-is-it-doing

반응형