๐Ÿ“•Week3 day1(Numpy)

๋ฐ•์ค€ํฌยท2023๋…„ 9์›” 4์ผ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

๋ชฉ๋ก ๋ณด๊ธฐ
13/28
post-thumbnail

Numpy


ํ–‰๋ ฌ์ด๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ๋‹ค์ฐจ์› ๋ฐฐ์—ด์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ํŒŒ์ด์ฌ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

numpy ์—ฐ์‚ฐ

๋จผ์ € numpy๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ importํ•œ๋‹ค.

import numpy as np

1.๋ฒกํ„ฐ์™€ ์Šค์นผ๋ผ ์—ฐ์‚ฐ

  • ๋ฒกํ„ฐ์˜ ๊ฐ ์›์†Œ์— ๋Œ€ํ•ด ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•œ๋‹ค.
x = np.array([1,2,3])
c= 5
print(f"๋”ํ•˜๊ธฐ:{x}+{c} = {x+c}")
print(f"๋นผ๊ธฐ:{x}-{c} = {x-c}")
print(f"๊ณฑํ•˜๊ธฐ:{x}*{c} = {x*c}")
print(f"๋‚˜๋ˆ„๊ธฐ:{x}/{c} = {x/c}")

>>>๋”ํ•˜๊ธฐ:[1 2 3]+5 = [6 7 8]
๋นผ๊ธฐ:[1 2 3]-5 = [-4 -3 -2]
๊ณฑํ•˜๊ธฐ:[1 2 3]*5 = [ 5 10 15]
๋‚˜๋ˆ„๊ธฐ:[1 2 3]/5 = [0.2 0.4 0.6]

2.๋ฒกํ„ฐ์™€ ๋ฒกํ„ฐ ์—ฐ์‚ฐ

  • ๊ฐ ๋ฒกํ„ฐ์˜ ๊ฐ™์€ ์ธ๋ฑ์Šค๋ผ๋ฆฌ ์—ฐ์‚ฐํ•œ๋‹ค.
y = np.array([1,3,5])
z = np.array([2,9,20])

print(f"๋”ํ•˜๊ธฐ:{y}+{z} = {y+z}")
print(f"๋นผ๊ธฐ:{y}-{z} = {y-z}")
print(f"๊ณฑํ•˜๊ธฐ:{y}*{z} = {y*z}")
print(f"๋‚˜๋ˆ„๊ธฐ:{y}/{z} = {y/z}")

>>>๋”ํ•˜๊ธฐ:[1 3 5]+[ 2  9 20] = [ 3 12 25]
๋นผ๊ธฐ:[1 3 5]-[ 2  9 20] = [ -1  -6 -15]
๊ณฑํ•˜๊ธฐ:[1 3 5]*[ 2  9 20] = [  2  27 100]
๋‚˜๋ˆ„๊ธฐ:[1 3 5]/[ 2  9 20] = [0.5        0.33333333 0.25      ]

Array Indexing

python์˜ ๋ฆฌ์ŠคํŠธ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ง„ํ–‰

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

print(W[0,0])
print(W[2,3])
>>>1
12

Array Slicing

W[0:2,1:3]
>>>array([[2, 3],
       [6, 7]])

#์ „์ฒด ์—ด slicing
W[0:2,0:4]
W[:2,:]#๋‘˜ ๋‹ค ์ถœ๋ ฅ๊ฐ’์ด ๊ฐ™๋‹ค
>>>array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

#์ „์ฒด ํ–‰ slicing
W[:,2:4]
>>>array([[ 3,  4],
       [ 7,  8],
       [11, 12]])

Array์˜ Broadcasting

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ™์€ Type์˜ data์— ๋Œ€ํ•ด์„œ๋งŒ ์—ฐ์‚ฐ์ด ์ ์šฉ ๊ฐ€๋Šฅ
ํ•˜์ง€๋งŒ ๋งŒ์•ฝ์— ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ ์—ฐ์‚ฐ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅ

#1. 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]#x๋ฅผ ์ „์น˜
print(a+x)
>>>[[1 2 3]
 [5 6 7]
 [7 8 9]]
 
#2. M X N, 1 X N
y = np.array([0,1,-1])
print(a*y)
>>>[[ 0  2 -3]
 [ 0  5 -6]
 [ 0  8 -9]]

# 3. M X 1, 1 X N
t = np.array([1,2,3])#์—ด๋ฒกํ„ฐ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•จ
t = t[:,None] # transgpose
u = np.array([2,0,-2])
print(t+u)
>>>[[ 3  1 -1]
 [ 4  2  0]
 [ 5  3  1]]

numpy&์„ ํ˜•๋Œ€์ˆ˜


์˜๋ฒกํ„ฐ : ์›์†Œ๊ฐ€ ๋ชจ๋‘ 0์ธ ๋ฒกํ„ฐ
np.zeros(dim) dim์€ ์–ด๋–ค ๊ฐ’ ํ˜น์€ ํŠœํ”Œ

np.zeros(3)
np.zeros((3,3))
>>>array([0., 0., 0.])
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

์ผ๋ฒกํ„ฐ : ์›์†Œ๊ฐ€ ๋ชจ๋‘ 0์ธ ๋ฒกํ„ฐ
np.ones(dim) dim์€ ์–ด๋–ค ๊ฐ’ ํ˜น์€ ํŠœํ”Œ

np.ones((3,3))
>>>array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

๋Œ€๊ฐํ–‰๋ ฌ(diagonal matrix) : main diagonal ์„ ์ œ์™ธํ•œ ์„ฑ๋ถ„์ด 0์ธ ํ–‰๋ ฌ

np.diag((2,4))
>>>array([[2, 0],
       [0, 4]])

ํ•ญ๋“ฑํ–‰๋ ฌ(identity matrix) : main diagonal์ด 1์ธ ๋Œ€๊ฐํ–‰๋ ฌ

np.eye(2, dtype = int)#dtype ์ง€์ • ๊ฐ€๋Šฅ float ๋””ํดํŠธ๊ฐ€ float
>>>array([[1, 0],
       [0, 1]])

ํ–‰๋ ฌ๊ณฑ(dot product)
*3์ฐจ์› ์ด์ƒ์˜ ํ–‰๋ ฌ์—์„œ np.dot()์™€ @ or np.mat_mul()์€ ๋‹ค๋ฅด๊ฒŒ ์—ฐ์‚ฐ

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
>>>array([[ 7, 33],
       [14, 36]])

๋Œ€๊ฐํ•ฉ(Trace) : ์ฃผ ๋Œ€๊ฐ์›์†Œ์˜ ๊ฐ’์„ ๋ชจ๋‘ ๋”ํ•œ ๊ฐ’์ด๋‹ค.

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

ํ–‰๋ ฌ์‹(determinant) : ์ •๋ฐฉํ–‰๋ ฌ์— ์Šค์นผ๋ผ๋ฅผ ๋Œ€์‘์‹œํ‚ค๋Š” ํ•จ์ˆ˜์˜ ํ•˜๋‚˜์ด๋‹ค.

arr_2 = np.array([[2,3,],[1,6]])
np.linalg.det(arr_2)
>>>9

์—ญํ–‰๋ ฌ(inverse matrix) : nxnํ–‰๋ ฌ A,B์— ๋Œ€ํ•ด AB=BA=I์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋ ฌ B๋ฅผ A์˜ ์—ญํ–‰๋ ฌ์ด๋ผ๊ณ  ํ•œ๋‹ค.

mat = np.array([[1,4],[2,3]])
mat_inv = np.linalg.inv(mat)
mat @ mat_inv
>>>array([[ 1.00000000e+00,  0.00000000e+00],
       [-1.11022302e-16,  1.00000000e+00]])

๊ณ ์œ ๊ฐ’๊ณผ ๊ณ ์œ ๋ฒกํ„ฐ(eigenvalue, eigenvector)

์ •๋ฐฉํ–‰๋ ฌ A์— ๋Œ€ํ•ด Ax=ฮปxAx=\lambda x๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์ƒ์ˆ˜ฮป\lambda์™€ ์ด์— ๋Œ€์‘ํ•˜๋Š” ๋ฒกํ„ฐx๋ฅผ ๊ณ ์œ ๊ฐ’ ๊ณ ์œ ๋ฒกํ„ฐ๋ผ ํ•œ๋‹ค.

mat = np.array([[2,0,-2],[1,1,-2],[0,0,1]])
np.linalg.eig(mat)
>>>(array([1., 2., 1.]),#์ด๊ฒŒ ๊ณ ์œ ๊ฐ’
 array([[0.        , 0.70710678, 0.89442719],#์ด๊ฒŒ ๊ณ ์œ ๋ฒกํ„ฐ
        [1.        , 0.70710678, 0.        ],
        [0.        , 0.        , 0.4472136 ]]))

eig_val, eig_vec = np.linalg.eig(mat)
mat @ eig_vec[:,0]#Ax์˜ ๊ฒฐ๊ณผ
>>>array([0., 1., 0.])

eig_val[0] * eig_vec[:,0]#eig_val[0]์€ ์Šค์นผ๋ผ์ด๋ฏ€๋กœ @ํ–‰๋ ฌ๊ณฑ์€ ์•ˆ๋จ 
>>>array([0., 1., 0.])

Exercises

1. ์–ด๋–ค ๋ฒกํ„ฐ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ L2 norm์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜ get_L2_norm()์„ ์ž‘์„ฑํ•˜์„ธ์š”

  • ๋งค๊ฐœ๋ณ€์ˆ˜ : 1์ฐจ์› ๋ฒกํ„ฐ (np.array)
  • ๋ฐ˜ํ™˜๊ฐ’ : ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ๋ฒกํ„ฐ์˜ L2 Norm๊ฐ’ (number)
import numpy as np

mat = np.array([1,3,5,7])

def get_L2_norm(mat):
    return np.linalg.norm(mat, ord=2)

print(get_L2_norm(mat))
>>>9.16515138991168

2. ์–ด๋–ค ํ–‰๋ ฌ์ด singular matrix(์—ญํ–‰๋ ฌ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ–‰๋ ฌ)์ธ์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜ is_singular() ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”

  • ๋งค๊ฐœ๋ณ€์ˆ˜ : 2์ฐจ์› ๋ฒกํ„ฐ(np.array)
  • ๋ฐ˜ํ™˜๊ฐ’ : ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ๋ฒกํ„ฐ๊ฐ€ singularํ•˜๋ฉด True, non-singularํ•˜๋ฉด False๋ฅผ ๋ฐ˜ํ™˜
import numpy as np

mat_1 = np.array([[1,3],[5,7]])
mat_2 = np.array([[1,2],[2,4]])

def is_singular(mat):
    return True if np.linalg.det(mat) == 0 else False

print(is_singular(mat_1))
print(is_singular(mat_2))
>>>False
True

๋~!


profile
๊ฒŒ์„๋ €๋˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณต๋ถ€

0๊ฐœ์˜ ๋Œ“๊ธ€