[Numpy] 배열(Array) 정렬

Hunie_07·2026년 3월 2일

Numpy

목록 보기
6/8
post-thumbnail

📌 Array 정렬

  • sort() : 행렬 정렬
  • argsort() : 정렬된 행렬의 인덱스 반환

📌 sort()

1️⃣ 1차원 배열 정렬

예시 배열

arr = np.array([3, 10, 5, -4, -9, 6])

1) 오름차순 정렬

  • np.sort() 적용시 오름차순으로 정렬된다.
sort_arr = np.sort(arr)
sort_arr

- 출력

array([-9, -4,  3,  5,  6, 10])
  • arr.sort() 적용시 원본 배열이 sort() 가 적용된 상태로 변경된다.
arr.sort()
arr

- 출력

array([-9, -4,  3,  5,  6, 10])

2) 내림차순 정렬

  • sort() 한 배열을 역순으로 출력한다.
np.sort(arr)[::-1]

- 출력

array([10,  6,  5,  3, -4, -9])

2️⃣ 2차원 배열 정렬

예시 배열

arr2 = np.array([[8, 12, 5],
			     [4, 2, 7]])

1) 행 기준 정렬

  • axis 미설정시 기본값 -1 로 행 기준 정렬한다.
np.sort(arr2)

- 출력

array([[ 5,  8, 12],
       [ 2,  4,  7]])

2) 열 기준 정렬

  • axis=0 설정시 열 기준 정렬한다.
np.sort(arr2, axis=0)

- 출력

array([[ 4,  2,  5],
       [ 8, 12,  7]])

3) 1차원 변경 후 정렬

  • axis=None 설정시 배열이 Flattened 되고, 그 후 정렬된다.
np.sort(arr2, axis=None)

- 출력

array([ 2,  4,  5,  7,  8, 12])

4) 구조화된 배열

  • 서로 다른 데이터 형식으로 갖는 배열

예시 배열

dtype = [('name', 'S10'), ('height', float), ('age', int)]
values = [('Arthur', 1.8, 41), ('Lancelot', 1.9, 38), ('Galahad', 1.7, 38)]
struct_arr = np.array(values, dtype=dtype)
struct_arr

- 출력

array([(b'Arthur', 1.8, 41), (b'Lancelot', 1.9, 38),
       (b'Galahad', 1.7, 38)],
      dtype=[('name', 'S10'), ('height', '<f8'), ('age', '<i8')])

  • sort() 적용시 맨 앞의 name 기준으로 정렬된다.
np.sort(struct_arr)

- 출력

array([(b'Arthur', 1.8, 41), (b'Galahad', 1.7, 38),
       (b'Lancelot', 1.9, 38)],
      dtype=[('name', 'S10'), ('height', '<f8'), ('age', '<i8')])

  • order= 적용시 해당 데이터 기준으로 정렬된다.
  • age 기준으로 정렬된 모습
np.sort(struct_arr, order='age')

- 출력

array([(b'Galahad', 1.7, 38), (b'Lancelot', 1.9, 38),
       (b'Arthur', 1.8, 41)],
      dtype=[('name', 'S10'), ('height', '<f8'), ('age', '<i8')])

  • order 기준에 리스트 형태로 적용하여 정렬 우선순위를 설정할 수 있다.
  • age 1순위 정렬 후 age 가 같은 두 데이터에서 height 로 정렬된 것을 볼 수 있다.
np.sort(struct_arr, order=['age', 'height'])

- 출력

array([(b'Galahad', 1.7, 38), (b'Lancelot', 1.9, 38),
       (b'Arthur', 1.8, 41)],
      dtype=[('name', 'S10'), ('height', '<f8'), ('age', '<i8')])

📌 argsort()

  • 정렬된 행렬의 인덱스를 반환한다.

1️⃣ 1차원 배열

예시 배열

arr = np.array([ 3, 10,  5, -4, -9,  6])

배열 정렬

np.sort(arr)

- 출력

array([-9, -4,  3,  5,  6, 10])
  • 정렬한 배열 기준 원본 배열에서의 인덱스를 반환한다.
    • -9 는 원본 배열에서 인덱스 4 에 위치하기에 4 를 반환한다.
sort_idx = np.argsort(arr)
sort_idx

- 출력

array([4, 3, 0, 2, 5, 1])

원본 배열 출력

arr[sort_idx]

- 출력

array([-9, -4,  3,  5,  6, 10])

2️⃣ 2차원 배열

예시 배열

arr2 = array([[ 8, 12,  5],
       		  [ 4,  2,  7]])

1) 열 기준 정렬

열 기준 정렬

np.sort(arr2, axis=0)

- 출력

array([[ 4,  2,  5],
       [ 8, 12,  7]])
  • 정렬 배열 인덱스
    • 첫 번째 열 (4, 8) 에서 4 는 원본 배열 (8, 4) 에서 인덱스 1 에 위치하고, 8 은 인덱스 0 에 위치 하기에 (1, 0) 가 된다.
np.argsort(arr2, axis=0)

- 출력

array([[1, 1, 0],
       [0, 0, 1]])

2) 행 기준 정렬

행 기준 정렬

np.sort(arr2, axis=1)

- 출력

array([[ 5,  8, 12],
       [ 2,  4,  7]])
  • 정렬 배열 인덱스
    • 첫 번째 행 (5, 8, 12) 에서 5 는 원본 배열 (8, 12, 5) 에서 인덱스 2 에 위치하므로 2 를 반환한다.
np.argsort(arr2, axis=1)

- 출력

array([[2, 0, 1],
       [1, 0, 2]])

3) 구조화된 배열

  • 다음과 같이 namesscores 가 연결된 데이터라 할때, 각각의 데이터를 기준으로 정렬할 수 있다.
names = np.array(['Beomwoo1','Beomwoo2','Kim','Joan','Lee','Beomwoo3', 'Park','Beomwoo4'])
scores = np.array([50, 70, 100, 60, 82, 90, 85, 80])

score 기준 정렬

sort_idx = np.argsort(scores)
sort_idx

- 출력

array([0, 3, 1, 7, 4, 6, 5, 2])

정렬한 score 에 해당하는 name 출력

names[sort_idx]

- 출력

array(['Beomwoo1', 'Joan', 'Beomwoo2', 'Beomwoo4', 'Lee', 'Park', 'Beomwoo3', 'Kim'],
			dtype='<U8')

names 기준 정렬 후 scores 출력

scores[np.argsort(names)]

- 출력

array([ 50,  70,  90,  80,  60, 100,  82,  85])

0개의 댓글