[TIL] Day 11 - numpy as np

기역의궁전·2021년 5월 6일
0

dev2_TIL

목록 보기
12/18

shape, reshape

arr_2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
### shape 2가지
arr_2d.shape  # (3,3)
np.shape(arr_2d) # (3,3)

## reshape
arr_2d.reshape((1,9)) # reshape은 m,n을 가진 튜플 인자 하나
arr_2d.rehape((-1,1)) # -1값은 남은 차원으로부터 추정해서 알아서 들어감 -> (9,1)

a = np.arange(2*3*5).reshape((2,3,5)) # 간단히 행렬만들 때 Tip

numpy 연산

vector & scalar

  • 벡터의 각 원소에 대해 연산을 진행
x = np.array([1,2,3]) 
c = 5

#x+c : [6 7 8]
#x-c : [-4 -3 -2]
#x*c : [ 5 10 15]
#x/c : [0.2 0.4 0.6]

vector & vector

  • 벡터의 같은 위치 즉 인덱스끼리
y = np.array([1,3,5])
z = np.array([2,9,20])

#y+z : [ 3 12 25]
#y-c : [ -1  -6 -15]
#y*c : [  2  27 100]
#y/c: [0.5        0.33333333 0.25      ]

Array Indexing

  • Python 리스트와 유사하게 진행
  • 단 [x][y]보단 [x,y]

ex)
w=(123456789101112)w = \left(\begin{matrix} 1 & 2 & 3 & 4 \\ 5 & 6 & 7 & 8 \\ 9 & 10 & 11 & 12 \end{matrix} \right)

w = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
w[0,0] # 1
w[2,3] # 12
w[2,-1] # 12

Array의 Broadcasting

기본적으로 같은 Type의 data에 대해서만 연산이 적용 가능
But 만약 피연산자가 연산 가능하도록 변환이 가능하다면 서로 다른 차원의 연산이 가능합니다.
이를 Broadcasting이라고 합니다.

전치행렬 만들기

#1
x = x[:,None] # 행벡터 -> 열벡터로 전치, 슬라이스로 1차원배열을 2차원으로
#2
x = x.reshape((-1,1))

1. M×N,M×1M \times N, M \times 1

(123456789)+(010)(123456789)+(000111000)\left(\begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{matrix} \right) + \left(\begin{matrix} 0 \\ 1 \\ 0 \end{matrix} \right) \quad \rightarrow \quad \left(\begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{matrix} \right) + \left(\begin{matrix} 0 & 0 & 0 \\ 1 & 1 & 1 \\ 0 & 0 & 0 \end{matrix} \right)

2. M×N,1×NM \times N, 1 \times N

(123456789)×(011)(123456789)×(011011011)\left(\begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{matrix} \right) \times \left(\begin{matrix} 0 & 1 & -1 \end{matrix} \right) \quad \rightarrow \quad \left(\begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{matrix} \right) \times \left(\begin{matrix} 0 & 1 & -1 \\ 0 & 1 & -1 \\ 0 & 1 & -1 \end{matrix} \right)

3. M×1,1×NM \times 1, 1 \times N

(111222333)+(202202202)\left(\begin{matrix} 1 & 1 & 1 \\ 2 & 2 & 2 \\ 3 & 3 & 3 \end{matrix} \right) + \left(\begin{matrix} 2 & 0 & -2 \\ 2 & 0 & -2 \\ 2 & 0 & -2 \end{matrix} \right)

1×N1 \times N,M×1M \times 1도 동일하다.

Numpy 선형대수

영행렬

np.zeros((3,3))
(000000000)\left(\begin{matrix} 0 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{matrix} \right)

  • 2차원 이상 인자는 tuple로 묶어서 넣기

일벡터(일행렬)

np.ones((3,3))

(111111111)\left(\begin{matrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right)

  • 2차원 이상 인자는 tuple로 묶어서 넣기

대각행렬(Diagonal Matrix)

np.diag((1,2,3))

(100020003)\left(\begin{matrix} 1 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 3 \end{matrix} \right)

  • Main Diagonal을 제외한 성분이 0인 행렬

항등행렬(Identity Matrix)

np.eye(n, dtype=int,uint,float,complex,...))

(100010001)\left(\begin{matrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{matrix} \right)

  • Main Diagonal이 1인 diagonal matrix(대각 행렬)
  • nxn 항등행렬을 생성할 수 있음.

행렬곱(dot product)

np.dot(a,b) or a @ b을 사용

  • 행렬간에 정의되는 곱 연산

행렬곱 dot vs matmul

  • 2차원 행렬까지의 곱은 동일한 결과를 보여준다.
  • 3차원 이상의 행렬(3-텐서)끼리 곱할 때는 다른 결과가 나온다.
  • dot는 행렬과 상수(constant)의 곱셈을 허용하지만, matmul은 Error를 일으킨다.

참고 블로그
https://bit.ly/3epl8xg

트레이스(trace)

np.trace()을 사용

  • Main Diagonal의 Sum
temp = np.arange(4*3).reshape((4,3))
print(temp)
print(temp.trace())

#[[ 0  1  2]
# [ 3  4  5]
# [ 6  7  8]
# [ 9 10 11]]
# -> 12

행렬식(determinant)

np.linalg.det()으로 계산

  • 행렬을 대표하는 값 중 하나
  • 선형변환 과정에서 Vector의 Scaling 척도

행렬식의 기하학적의미 참고 유튜브
https://www.youtube.com/watch?v=2bv_7QzBS4Y
https://www.youtube.com/watch?v=odULaDE65AI

np.linalg.det(arr_3) # 0의 의미는 singular하다. -> 역행렬이 없다.

역행렬(Inverse Matrix)

np.linalg.inv()를 사용

  • 행렬 A에 대해서 AA1=A1A=IAA^{-1} = A^{-1}A = I를 만족하는 행렬 A1A^{-1}
mat_2 = np.array([[1,2,3],[4,5,6],[7,8,9]])

mat_2
#np.linalg.inv(mat_2)  -> Error
# 역행렬이 존재하지 않을 경우 inv는 에러

고유값과 고유벡터 (eigenvalue and eigenvector)

np.linalg.eig()로 계산

  • 정방행렬(nxn) A에 대해서 Ax=λxAx = \lambda x를 만족하는 λ\lambdaxx를 각각 고유값과 고유벡터라 한다.
mat = np.array([[2,0,-2],[1,1,-2],[0,0,1]])
#array([[ 2,  0, -2],
#       [ 1,  1, -2],
#       [ 0,  0,  1]])

np.linalg.eig(mat) # 고유값, 고유벡터를 반환하는데 고유값 인덱스 수능로 고유벡터는 column 기준

#(array([1., 2., 1.]),
# array([[0.        , 0.70710678, 0.89442719],
#        [1.        , 0.70710678, 0.        ],
#        [0.        , 0.        , 0.4472136 ]]))

0개의 댓글