[Python.NumPy] Identity 행렬, eye, diag 함수 이해하기 - Creation Function III
2020. 12. 6. 05:00ㆍPython과 머신러닝/NumPy 데이터 분석
0. 요약
- 이전 Creation Function에 관한 포스트를 보면 Creation function이 뭔지 더 쉽게 이해할 수 있다.
2020/12/04 - [Python과 머신러닝/Python 데이터 수집] - NumPy arange/zeros/empty 함수의 차이 - Creation Function I
2020/12/05 - [Python과 머신러닝/Python 데이터 수집] - NumPy ones_like, zeros_like, empty_like 함수 - Creation Function II - 이번 포스트에서는 identity 행렬을 NumPy로 만드는 방법, 그리고 eye함수 diag 함수는 어떻게 사용할 수 있는지 보자.
1. Identity 행렬 만들기
#identity 행렬 만들기 (대각 행렬, 대각선이 1인 행렬)
In [1]:np.identity(n=5, dtype=np.int8) # 5x5의 np.int8의 identity 행렬 생성
Out[1]:array([[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]],
dtype=int8)
- Identity matrix란 항등 행렬 혹은 단위 행렬 이라고 불린다..
- 쉽게 말해 가운데 대각선의 값이 전부 1이고, 나머지는 0으로 채워진 행렬을 뜻한다.
- 숫자들 간의 곱셈을 할 때 어떤 수를 1과 곱해도 원래의 숫자가 나오듯, Identity matrix는 어떤 행렬을 곱해도 원래의 행렬이 나오는 행렬을 의미한다.
- 그래서 identity matrix라는 이름을 붙였는데, 오히려 항등 행렬/단위행렬이란 이름은 직관적이지 못하다고 생각한다.
- n은 row/col의 개수로 전달하고, dtype으로 데이터 타입을 지정해주면, n x n의 identity 행렬이 생성된다.
2. np.eye 함수
In [2]:np.eye(N=3, M=5, # 총 행렬의 크기는 3x5 로 만들어 달라
k=1, # identity matrix의 시작은 1열부터 시작하라
dtype=np.int8) # dtype은 int8로 설정
Out[2]:array([[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]],
dtype=int8)
- eye 함수로 생성되는 배열은 identity와 유사하다.
- 차이는 Identity 행렬은 항상 nxn의 행렬이라면, eye는 원하는 NxM으로 행렬을 만들 수 있다.
- k 변수를 통해서 identity matrix가 시작할 열을 지정해줄 수 있다.
- 위의 예제에서 보면, N=3/M=5/k=1이기 때문에
3x5 행렬을 만들고, 1번 열부터 시작하여 1을 대각선으로 입력하고, 나머지는 0으로 채워진 행렬을 array 형태로 반환한다.
3. np.daig 함수
In [3]:matrix = np.arange(9).reshape(3,-1)
matrix
Out[3]:array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [4]:np.diag(matrix, k=1) #matrix의 k열을 기준으로 대각선에 있는 값들을 array에 담아서 반환함
Out[4]:array([1, 5])
- diag 함수는 parameter로 전달받은 행렬의 k번째 열부터 있는 대각선의 값들을 1차원 array로 반환하는 함수이다.
- np.diag(matrix, k=1)은 'matrix 행렬의 1번 열부터의 대각선 값들을 반환해줘' 라는 요청이 된다.
- 그렇기 때문에 [0, 1], [1, 2]에 있는 값들을 뽑아서 하나의 배열로 반환한다.
- 그래서 Out[4]는 [1, 5]의 값을 반환하게 된다.
4. 마무리
- Identity 행렬은 행렬의 계산에 항상 필요하기 때문에, 어떤 parameter로 동작하는지 기억해두자.
- eye와 diag 함수도 때에 따라 요긴하게 쓰이는 상황들이 생긴다. 저걸 직접 구현하려면 노력 대비 너무 단순한 기능이기 때문에, 주어진 함수를 잘 사용해서 더 의미 있는 알고리즘을 짜는데 시간을 투자하자.
관련 글
2020/12/04 - [Python과 머신러닝/Python 데이터 수집] - NumPy arange/zeros/empty 함수의 차이 - Creation Function I