왜 Numpy를 배워야 할까 -3 (행렬 정렬, 전치 행렬, ...)
2024.05.21 - [PYTHON/MachineLearning] - 왜 Numpy를 배워야 할까? -2 (넘파이 인덱싱, ...)
왜 Numpy를 배워야 할까? -2 (넘파이 인덱싱, ...)
2024.05.21 - [PYTHON/MachineLearning] - 왜 Numpy를 배워야 할까? -1 왜 Numpy를 배워야 할까? -1 (배열 생성, 차원 변환, ...)1. Numpy 소개* Numpy 란? 넘파이(Numpy, Numerical Python)는 파이썬에서 과학적 계산을 위한
luvtako.tistory.com
- 넘파이 인덱싱 관련 내용은 이전 글 참고해주세요 :D
1. 행렬의 정렬 - sort( )와 argsort( )
* 행렬 정렬
- 넘파이의 행렬 정렬은 np.sort( )와 같이 넘파이에서 sort( )를 호출하는 방식과 ndarray.sort( )와 같이 행렬 자체에서 sort( )를 호출하는 방식이 있다.
- np.sort( ) : 원 행렬은 그대로 유지한 채 원 행렬의 정렬된 행렬을 반환한다.
- ndarray.sort( ) : 원 행렬 자체를 정렬한 형태로 변환하며 반환 값은 None이다.
org_array = np.array([3, 1, 9, 5])
print('원본 행렬 :', org_array)
# np.sort( )로 정렬
sort_array1 = np.sort(org_array)
print('np.sort( ) 호출 후 반환된 정렬 행렬 :', sort_array1)
print('np.sort( ) 호출 후 원본 행렬 :', org_array)
# ndarray.sort( )로 정렬
sort_array2 = org_array.sort()
print('org_array.sort( ) 호출 후 반환된 행렬: ', sort_array2)
print('org_array.sort( ) 호출 후 원본 행렬: ', org_array)
[output]
원본 행렬 : [3 1 9 5]
np.sort( ) 호출 후 반환된 정렬 행렬 : [1 3 5 9]
np.sort( ) 호출 후 원본 행렬 : [3 1 9 5]
org_array.sort( ) 호출 후 반환된 행렬: None
org_array.sort( ) 호출 후 원본 행렬: [1 3 5 9]
- np.sort( )나 ndarray.sort( ) 모두 기본적으로 오름차순으로 행렬 내 원소를 정렬한다.
- 내림차순으로 정렬하기 위해서는 [::-1]을 적용한다.
sort_array1_desc = np.sort(org_array)[::-1]
print('내림차순으로 정렬 :', sort_array1_desc)
[output]
내림차순으로 정렬 : [9 5 3 1]
- 행렬이 2차원 이상일 경우에 axis 축 값 설정을 통해 로우 방향, 또는 칼럼 방향으로 정렬을 수행할 수 있다.
array2d = np.array([[8, 12], [7, 1]])
sort_array2d_axis0 = np.sort(array2d, axis = 0)
print('로우 방향으로 정렬 :\n', sort_array2d_axis0)
sort_array2d_axis1 = np.sort(array2d, axis = 1)
print('칼럼 방향으로 정렬 :\n', sort_array2d_axis1)
[output]
로우 방향으로 정렬 :
[[ 7 1]
[ 8 12]]
칼럼 방향으로 정렬 :
[[ 8 12]
[ 1 7]]
* 정렬된 행렬의 인덱스를 반환하기
- 원본 행렬이 정렬되었을 때 기존 원본 행렬의 원소에 대한 인덱스를 필요로 할 때 np.argsort( )를 이용한다.
- np.argsort( )는 정렬 행렬의 원본 행렬 인덱스를 ndarray 형으로 반환한다.
org_array = np.array([3, 1, 9, 5])
sort_indices = np.argsort(org_array)
print(type(sort_indices))
print('행렬 정렬 시 원본 행렬의 인덱스 :', sort_indices)
[output]
<class 'numpy.ndarray'>
행렬 정렬 시 원본 행렬의 인덱스 : [1 0 3 2]
- 오름차순이 아닌 내림차순으로 정렬 시에 원본 행렬의 인덱스를 구하는 것도 np.argsort( )[::-1]과 같이 [::-1]을 적용하면 된다.
org_array = np.array([3, 1, 9, 5])
sort_indices_desc = np.argsort(org_array)[::-1]
print('행렬 내림차순 정렬 시 원본 행렬의 인덱스 :', sort_indices_desc)
[output]
행렬 내림차순 정렬 시 원본 행렬의 인덱스 : [2 3 0 1]
* argsort( ) 활용하기
import numpy as np
name_array = np.array(['John', 'Mike', 'Sarah', 'Kate', 'Samuel'])
score_array = np.array([78, 95, 84, 98, 88])
sort_indices_asc = np.argsort(score_array)
print('성적 오름차순 정렬 시 score_array의 인덱스 :', sort_indices_asc)
print('성적 오름차순으로 name_array의 이름 출력 :', name_array[sort_indices_asc])
[output]
성적 오름차순 정렬 시 score_array의 인덱스 : [0 2 4 1 3]
성적 오름차순으로 name_array의 이름 출력 : ['John' 'Sarah' 'Samuel' 'Mike' 'Kate']
- 시험 성적순으로 학생 이름을 출력하고자 한다면 np.argsort(score_array)를 이용해 반환된 인덱스를 name_array에 팬시 인덱스로 적용해 추출 가능하다.
- 내림차순은 np.argsort(score_array)[::-1]로 바꿔주면 된다.
2. 선형대수 연산 - 행렬 내적과 전치 행렬 구하기
* 행렬 내적(행렬 곱)
- 행렬 내적은 행렬 곱이며, 두 행렬 A와 B의 내적은 np.dot( )을 이용해 계산이 가능하다.
- 두 행렬 A와 B의 내적은 왼쪽 행렬의 로우(행)와 오른쪽 행렬의 칼럼(열)의 원소들을 순차적으로 곱한 뒤 그 결과를 모두 더한 값이다.
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([[7, 8], [9, 10], [11, 12]])
dot_product = np.dot(A, B)
print('행렬 내적 결과 :\n', dot_product)
[output]
행렬 내적 결과 :
[[ 58 64]
[139 154]]
* 전치 행렬
- 원 행렬에서 행과 열 위치를 교환한 원소로 구성한 행렬을 그 행렬의 전치 행렬이라고 한다.
- 넘파이의 transpose( )를 이용해 전치 행렬을 쉽게 구할 수 있다.
A = np.array([[1, 2], [3, 4]])
transpose_mat = np.transpose(A)
print('A의 전치 행렬 :\n', transpose_mat)
[output]
A의 전치 행렬 :
[[1 3]
[2 4]]
* 참고 도서
- 저자
- 권철민
- 출판
- 위키북스
- 출판일
- 2022.04.21