TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 기초>

[파이썬] 넘파이(NumPy) - 3

by 기록자_Recordian 2024. 5. 25.
728x90
반응형
시작에 앞서
해당 내용은 '<파이썬 머신러닝 완벽 가이드> 권철민 지음. 위키북스' 를 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적을 참고해 주시기 바랍니다.
 

네이버 도서

책으로 만나는 새로운 세상

search.shopping.naver.com


기존 내용
 

[파이썬] 넘파이(NumPy) - 2

시작에 앞서해당 내용은 ' 권철민 지음. 위키북스' 를 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적을 참고해 주시기 바랍니다.기존 내용 [파이썬] 넘파이(NumPy) - 1시작에 앞서해당 내

puppy-foot-it.tistory.com


sort( ), argsort( ): 행렬의 정렬

 

넘파이에서 행렬을 정렬하는 대표적인 방법 - np.sort( ) / ndarray.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_array2 = org_array.sort()
print('org_array.sort( ) 호출 후 반환된 정렬 행렬:', sort_array2)
print('org_array.sort( ) 호출 후 원본 행렬:', org_array)

 

▶ 원본 행렬 [1 3 9 5]에 대해서 np.sort( )는 원본 행렬을 변경하지 않고 정렬된 형태로 반환

▶ ndarray.sort( )는 원본 행렬 자체를 정렬한 값으로 변환

※ np.sort( )나 ndarray.sort( ) 모두 기본적으로 오름차순으로 행렬 내 원소 정렬

※ 내림차순 정렬을 위해서는 [::-1] 적용.

 

◆ 행렬이 2차원 이상일 경우

행렬이 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)


argsort( )

 

◆ 정렬된 행렬의 인덱스 반환하기

원본 행렬이 정렬되었을 때 기존 원본 행렬의 원소에 대한 인덱스를 필요로 할 때 np.argsort( )를 이용한다.

np.argsort( )는 정렬 행렬의 원본 행렬 인덱스를 ndarray 형으로 반환한다.

#np.argsort( )를 이용해 원본 행렬의 정렬 시 행렬 인덱스 값 구하기
org_array = np.array([3, 1, 9, 5])
sort_indices = np.argsort(org_array)
print(type(sort_indices))
print('행렬 정렬 시 원본 행렬의 인덱스:', sort_indices)

 

※ 오름차순이 아닌 내림차순으로 정렬 시에 원본 행렬의 인덱스를 구하는 것 역시 [::-1] 적용

 

argsort( )는 넘파이에서 매우 활용도가 높다.

넘파이의 ndarray는 RDBMS의 TABLE 칼럼이나 판다스 DataFrame 칼럼과 같은 메타 데이터를 가질 수 없다. 따라서 실제 값과 그 값이 뜻하는 메타 데이터를 별도의 ndarray로 각각 가져야만 한다.

이를테면,

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

 

하단과 같이 학생별 시험 성적을 데이터로 표현하기 위해서는 학생의 이름과 시험 성적을 각각 ndarray로 가져야 한다.

이때 시험 성적순으로 학생 이름을 출력하고자 한다면 np.argsort(score_array)를 이용해 반환된 인덱스를 name_array에 팬시 인덱스로 적용해 추출할 수 있으며, 이러한 방식은 넘파이의 데이터 추출에서 많이 사용된다.


선형대수 연산 - 행렬 내적과 전치 행렬 구하기

 

◆ 행렬 내적(행렬 곱)

 

행렬 내적은 행렬 곱이며, 두 행렬 A와 B의 내적은 np.dot( )을 이용해 계산 가능하다.

위 그림에서 A 행렬과 B행렬의 내적 연산인 np.dot(A,B)의 결과 행렬의 1행 1열의 값인 58은 A행렬의 1행과 B행렬의 1열의 원소들을 차례로 곱한 값을 더한 것이다.

마찬가지로 내적 결과 행렬의 1행 2열의 값인 64는 A행렬의 1행과 B행렬의 2열의 원소들을 차례로 곱한 값을 더한 값이다.

▶ 이러한 행렬 내적의 특성으로 왼쪽 행렬의 열 개수와 오른쪽 행렬의 행 개수가 동일해야 내적 연산이 가능하다.

 

이를 코드로 생성하여 실행해보면,

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)

 

◆ 전치 행렬

 

원 행렬에서 행과 열 위치를 교환한 원소로 구성한 행렬을 그 행렬의 전치 행렬이라고 한다.

출처: 위키백과
출처: 위키백과

 

넘파이의 transpose( )를 이용해 전치 행렬을 쉽게 구할 수 있다.

※ 넘파이의 transpose는 배열의 요소 위치를 주대각선을 기준으로 바꾸는 작업을 말한다. 이는 배열의 shape을 역방향으로 바꾸는 것뿐만 아니라 원하는 방향으로 배열의 요소를 재정렬할 수 있게 해준다. transpose 메소드를 사용하거나 T 속성을 이용하여 전치 작업을 수행할 수 있다. 이는 행렬의 행과 열을 바꿀 때 유용하게 사용될 수 있다.

A = np.array([[1, 2],
              [3, 4]])
transpose_mat = np.transpose(A)
print('A의 전치 행렬:\n', transpose_mat)


NumPy 기초 전체 코드

NumPy_Basic.ipynb
0.02MB

728x90
반응형