본문 바로가기
공부 목록/IT & 프로그래밍

파이썬 numpy의 배열 정렬 함수 sort와 argsort 사용법

by 독학박사 2023. 6. 19.

목차


    파이썬의 numpy 사용이 강력한 이유는 ndarray의 데이터 구조가 아닐까 합니다. 이는 리스트와 형태가 비슷하지만 수치 계산을 위해 유용하게 사용할 수 있습니다. 리스트 1 + 리스트 2는 리스트 1에 리스트 2의 요소를 삽입하는 기능이지만 ndarray는 각 요소의 합을 만들어 냅니다. 이러한 ndarray의 값들을 정렬하기 위해 numpy의 sort 함수를 사용할 수 있습니다. 또한 각 요소를 정렬하고 해당 인덱스를 반환해 주는 argsort 함수도 있습니다. 배열 정렬을 위해 두 함수의 사용법을 정리해 보겠습니다.

     

     

    배열 정렬 함수들
    배열 정렬 함수들

     

     

    1. numpy.sort() 함수

    numpy.sort 함수의 일반적인 구문은 다음과 같습니다. 여기서 a는 정렬할 배열이며, axis, kind, order는 선택적 매개변수입니다.

     

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

     

    axis:
    정렬할 축(axis)을 지정합니다. 기본값은 -1로, 마지막 축을 기준으로 정렬합니다. 다른 축을 기준으로 정렬하려면 해당 축의 인덱스를 지정합니다.

    kind:
    정렬 알고리즘의 종류를 지정할 수 있습니다. 기본값은 'quicksort'로, 퀵 정렬을 사용하며 다른 가능한 값으로 'heapsort', 'mergesort', 'stable' 등이 있습니다. 'stable'은 정렬 전에 배열의 상대적인 순서를 유지하려는 경우 사용됩니다.

    order:
    정렬에 사용할 필드(속성)를 지정합니다. 배열이 구조화된 경우에만 사용됩니다.

     

    numpy.sort 함수는 원본 배열을 변경하지 않고 새로운 정렬된 배열을 반환합니다. 만약 원본 배열을 직접 변경하고 싶다면 numpy.ndarray.sort 메서드를 사용할 수 있습니다.

     

     

    2. numpy.sort() 함수 예제 코드

    import numpy as np
    arr = np.array([3, 1, 2, 5, 4])
    sorted_arr = np.sort(arr)
    print(sorted_arr)
    
    # [1 2 3 4 5]
    
    # 다차원 배열 정렬
    arr = np.array([[3, 2, 1], [6, 5, 4]])
    sorted_arr = np.sort(arr, axis=1)
    print(sorted_arr)  
    
    # [[1 2 3]

     

    위의 예시에서 numpy.sort 함수를 사용하여 배열을 정렬하였습니다. 첫 번째 예시에서는 1차원 배열을 오름차순으로 정렬하였고, 두 번째 예시에서는 2차원 배열을 각 행을 기준으로 오름차순으로 정렬하였습니다. numpy.sort 함수는 오름차순으로만 정렬이 가능합니다. 내림차순 정렬은 추가 인덱스 조작이 필요합니다.

     

     

    3. numpy.sort의 내림차순 정렬 코드

    내림차순으로 정렬하기 위해 numpy.sort 함수를 사용한 후에 [::-1] 인덱싱을 사용하여 정렬된 배열의 요소를 역순으로 가져올 수 있습니다. 이를 통해 배열을 내림차순으로 정렬할 수 있습니다.

     

    import numpy as np
    arr = np.array([3, 1, 2, 5, 4])
    sorted_arr_descending = np.sort(arr)[::-1]
    print(sorted_arr_descending)
    
    # [5 4 3 2 1]

     

     

    4. numpy.argsort 함수 사용법

    numpy.argsort 함수는 주어진 배열의 요소를 정렬한 후 해당 요소의 인덱스를 반환하는 함수입니다. 반환된 인덱스는 원래 배열의 요소를 정렬한 순서대로 나열한 것입니다. 매개변수는 sort와 동일함으로 설명을 생략합니다.

     

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

     

    5. numpy.argsort 함수 예제 코드

    import numpy as np
    arr = np.array([3, 1, 2, 5, 4])
    sorted_indices = np.argsort(arr)
    print(sorted_indices)
    
    # [1 2 0 4 3]
    
    # 다차원 배열 정렬
    arr = np.array([[3, 2, 1], [6, 5, 4]])
    sorted_indices_axis0 = np.argsort(arr, axis=0)
    sorted_indices_axis1 = np.argsort(arr, axis=1)
    print(sorted_indices_axis0)
    
    # [[0 0 0]
    #  [1 1 1]]
    
    print(sorted_indices_axis1)
    
    # [[2 1 0]
    #  [2 1 0]]

     

     

    위의 예시에서 numpy.argsort 함수를 사용하여 배열의 요소를 정렬한 후, 정렬된 요소의 인덱스를 반환받았습니다. 첫 번째 예시에서는 1차원 배열을 정렬하고, 두 번째 예시에서는 2차원 배열을 행과 열을 기준으로 정렬하였습니다.

     

    sorted_indices는 첫 번째 예시에서 반환된 정렬된 요소의 인덱스 배열입니다. 따라서 원래 배열의 요소를 arr[sorted_indices]와 같이 접근하면 정렬된 상태의 배열을 얻을 수 있습니다.

     

    두 번째 예시에서 sorted_indices_axis0는 첫 번째 축을 따라 정렬된 요소의 인덱스를 나타내는 배열입니다. 마찬가지로 sorted_indices_axis1는 두 번째 축을 따라 정렬된 요소의 인덱스를 나타내는 배열입니다. 이러한 인덱스 배열을 사용하여 원래 배열의 요소를 접근하면 정렬된 상태의 다차원 배열을 얻을 수 있습니다.

     

     

    6. 마치며

    파이썬의 ndarray 구조의 데이터를 정렬시켜주는 sort와 argsort 함수에 대해 정리해 보았습니다. 해당 함수는 기본적으로 올름차순 정렬만 가능합니다. 내림차순 정렬을 위해서는 인덱스 조작이 추가로 필요합니다. sort는 배열의 값을 직접적으로 정렬해 주지만, argsort는 정렬된 값의 인덱스를 반환합니다. sort 함수는 원본을 수정하지 않고 정렬된 배열만 반환합니다. 원본을 수정하려면 numpy.ndarray.sort 함수를 사용하면 됩니다.