python 모듈인 numpy를 알아보고 선형대수 연산 기초를 알아본다.

numpy 모듈 사용하기

import numpy as np

L = range(1000)
%timeit [i**2 for i in L]

N = np.arrange(1000)
%timeit N**2

실행 시켜보면 넘파이를 사용한 배열 이 더 빠른것을 확인 할 수 있다.

arr = np.array([1,2,3])
arr_2d = np.array([[1,2,3],[4,5,6],[7,8,9]])

arr.shape
arr_3d.shape

다차원 배열을 선언할 수 있고 shape 을 이용해 배열의 형태를 확인할 수도 있다.

numpy 연산

  • 벡터와 스칼라 연산
y = np.array([1,2,3])
z = np.array([2,9,20])

print("더하기 : {}".format(y + z))
print("빼기 : {}".format(y - z))
print("곱하기 : {}".format(y * z))
print("나누기 : {}".format(y / z))

  • 벡터와 벡터 연산
  • 각 벡터의 요소 끼리 연산
x = np.array([1,2,3])
c = 5

print("더하기 : {}".format(x + c))
print("빼기 : {}".format(x - c))
print("곱하기 : {}".format(x * c))
print("나누기 : {}".format(x / c))

array의 indexing과 slicing

  • 파이썬의 리스트와 유사하게 진행
W = np.array([1,2,3,4],[5,6,7,8],[9,10,11,12])
W[0,0]
w[2,3]

W[0:2, 1:3]
# 2,3
# 6,7

W[0:2, 0:4]
W[0:2]
W[0:2, :]

W[0:3, 2:4]
W[:, 2:4]

Array의 Broadcasting

  • 피연산자가 연산 가능하도록 변환을 하여 연산을 진행하는 것을 Broadcasting 이라 함.

  • M x N, M x 1

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
x = np.array([0,1,0])

x = x[:, None]#transpose

print(a+x)
  • M x N, 1 x N
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
y = np.array([0,1,-1])

print(a*y)
  • M x 1, 1 x N
t = np.array([1,2,3]) 

t = t[:, None] #transpose

u = np.array([2,0,-2])
print(t+u)

영벡터(행렬)

  • 원소가 모두 0인 벡터(행렬)
np.zeros(3)
np.zeros((3,3))
np.zeros((3,3,3))

일벡터(행렬)

  • 원소가 모두 1인 벡터(행렬)
np.ones(2)
np.ones((3,3))

대각행렬(diagonal matrix)

  • Main diagonal을 제외한 성분이 0인 행렬
np.diag((2,4))
np.diag((1,3,5))

항등행렬(identity matrix)

  • Main diagonal이 1인 대각행렬
  • 인자로 들어가는 dtype의 기본 값은 float
np.eye(2, dtype=int)
np.eye(3, dtype=float)

행렬곱(dot product)

  • 행렬간의 곱연산
mat_1 = np.array([[1,4],[2,3]])
mat_2 = np.array([[7,9],[0,6]])

mat_1.dot(mat_2)
mat_1 @ mat_2

트레이스(trace)

  • main diagonal의 합
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])

arr.trace()

행렬식(determinant)

  • 행렬을 대표하는 값들 중 하나
arr_2 = np.array([[2,3],[1,6]])

np.linalg.det(arr_2)

arr_3 = np.array([[1,4,7],[2,5,8],[3,6,9]])

np.linalg.det(arr_3)

역행렬(inverse matrix)

  • 행렬 A에 대해 AB = BA = I 를 만족하는 행렬 B = A^-1
mat = np.array([[1,4],[2,3]])

mat_inv = np.linalg.inv(mat)

mat @ mat_inv

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

  • 정방행렬 A에 대해 $Ax = \lambda x$를 만족하는 상수$\lambda$와 이에 대응하는 벡터
mat = np.array([[2,0,-2],[1,1,-2],[0,0,1]])

eig_val, eig_vec = np.linalg.eig(mat)

mat @ eig_vec[:, 0]
eig_val[0] * eig_vec[:, 0]
  • 1차원 벡터의 norm 값을 구하는 함수 작성
  • 2차원 벡터의 singular matrix 인지 확인하는 함수 작성