AI 머신러닝 딥러닝/AI 수학 입문 공부일지

AI 인공지능 수학 공부일지 4. Numpy 기초 행열

Tomitom 2022. 10. 21. 17:21
반응형

 

Numpy 라는 파이썬 확장 모듈은 인공지능을 구현할 때 쓰는 벡터와 행렬을 주로 다룹니다. 

처음에 모듈을 실행할 때에는 파이썬의 다른 모듈들과 동일하게 import numpy 로 호출하는데 

통상적으로 as np 를 붙여서 np로 이름을 붙여 사용합니다. (이렇게 하면 이후에 .np 라는 이름으로 Numpy 모듈을 다룰 수 있습니다. 

 

import numpy as np

 

Numpy의 배열은 여러 함수로 만들 수 있습니다. 각 함수들을 살펴볼게요.

 

● array() 함수를 통해 python의 리스트로 직접 배열을 만들 수 있습니다.

 

(1) 리스트에 범위 값 넣기 

import numpy as np

a = np.array(list(range(6)))

print(a)

.array() 함수에 리스트를 넣어서 배열을 만듭니다. 

[0 1 2 3 4 5]

 

(2) 리스트 안에 리스트를 넣기 (2차원 리스트) 

b= np.array([
    [0, 1, 2],
    [3, 4, 5]
])

print(b)
[[0 1 2]
 [3 4 5]]

결과물은 마치 python 의 리스트처럼 보이지만 리스트는 아니고, 수학의 행렬을 구현한 배열입니다.

겉보기에도 배열이기 때문에  , (콤마) 가 들어가있지 않습니다. 

 

이처럼 함수를 넣고 어떤 새로운 객체가 만들어지는 경우 '팩토리 메소드' 라고도 부릅니다.

팩토리 메소드 = 메소드를  호출하면 객체가 생성이 되는 것.

 

● .zeros() 함수와 .ones() 함수 .arange() 함수가 있습니다. 

zeros() 함수는 요소의 모든 개체들이 전부 0인 배열,

ones() 함수는 요소의 모든 개체들이 전부 1인 배열,

arrange() 함수는 0부터 인수 이전까지의 정수가 차례대로 나열된 배열을 생성합니다. 

 

import numpy as np

d = np.zeros(8)   # 0이 8개 저장된 배열 
print(d)

e = np.ones(8)    # 1이 8개 저장된 배열
print(e)

f= np.arange(8)   # 0부터 7까지 저장된 배열
print(f)
[0. 0. 0. 0. 0. 0. 0. 0.]
[1. 1. 1. 1. 1. 1. 1. 1.]
[0 1 2 3 4 5 6 7]

 

 

 

.zeros() 와 ones() 함수는 일렬로만 세울 수 있는 것이 아니라 튜플 형태로 행열 형태를 만들 수 있습니다. 

 

d = np.zeros((2,3))   -> 2행 3열의 제로 데이터 

이렇게 만들어진 데이터들의 행과 열의 수는 .shape()  함수로 확인할 수 있습니다. 

 

f= np.arange(8)    ->  0부터 7까지 저장된 배열이 있을 때 
np.shape(f)    -> 배열의 형태를 조사하면 8행, 0열(공백) 이 출력됩니다. 

 

import numpy as np

d = np.zeros((2,3))   # 튜블로 정렬해서 2행 3열의 제로 데이터를 만듦
print(d)

e = np.ones((2,3))    # 튜플로 정렬해서 2행 3열의 원 데이터를 만듦
print(e)

f= np.arange(8)   # 0부터 7까지 저장된 배열
print(f)

print(np.shape(f)) # 배열의 형태를 조사한다. (행, 열 의 수를 나타낸다)
[[0. 0. 0.]
 [0. 0. 0.]]
[[1. 1. 1.]
 [1. 1. 1.]]
[0 1 2 3 4 5 6 7]
(8,)

 

이렇게 만들어진 배열들은 각 배열들끼리 대응하여 연산이 가능해집니다. 

[0, 1, 2] 의 배열과 [3, 4, 5] 의 동일한 배열이 생겼을 때 배열의 각 행과 열의 요소끼리 연산이 이루어집니다. 

import numpy as np

a = np.array([[0, 1, 2],
             [3, 4, 5]])  # 2차원 배열

print(a)
print()
print(a + 3)   # 각 요소에 3을 더함
print()
print(a * 3)   # 각 요소에 3을 곱함 

b = np.array([[0, 1, 2],
              [3, 4, 5]])  # 2차원 배열
c = np.array([[2, 0, 1],
              [5, 3, 4]])  # 2차원 배열

print(b)
print()
print(c)
print()
print(b + c)  # 각 행과 열에 대응해서 값을 구함 
print(b * c)

2차원 리스트도 마찬가지로 값이 계산됩니다. 

 

[[0 1 2]
 [3 4 5]]

[[3 4 5]
 [6 7 8]]

[[ 0  3  6]
 [ 9 12 15]]
[[0 1 2]
 [3 4 5]]

[[2 0 1]
 [5 3 4]]

[[2 1 3]
 [8 7 9]]
[[ 0  0  2]
 [15 12 20]]

 

 

리스트와 동일하게 배열은 범위 선택이 가능합니다. 

리스트에서 : 가 값 전체를 선택하는 것처럼 배열에도 동일하게 행 혹은 열의 전부를 선택합니다.

즉 배열에서 값을 지정해서 출력하거나 값을 바꿀 때에는 리스트와 동일하게 이루어집니다.  

2차원 리스트에서

b = np.array( [ [ 0, 1, 2],

                        [3, 4, 5] ] ) 

b[1, 2]  인 경우 행과 열이 지정되어 값은 5가 출력됩니다. 

a = np.array([
    [2, 4, 6],
    [1, 5, 7]
])

print(a[:,1])    # : <- 는 전부를 다 선택하는 것. 행의 전부를 선택하고 1번 열을 선택하는 것.
print(a[1,:])

a[:,1] = np.array([10,20])  # 열의 1번 값들을 전부 바꿀 수 있음. 
print(a)
[4 5]
[1 5 7]
[[ 2 10  6]
 [ 1 20  7]]

 

함수 처리 또한 마찬가지로 이루어집니다. 

.array() 로 배열을 만들고 함수에 대응시키면 각 행과열이 적용한 배열이 출력됩니다. 

a = np.array([
    [1, 2],
    [3, 4]
])

def powerNum(x) : 
    return x ** 2

b = powerNum(a)   # a의 행열을 받아서 powerNum 함수에 따라 각각의 값을 제곱한다.
print(b)
[[ 1  4]
 [ 9 16]]

 

이 밖에도 Numpy 는 여러가지 기능을 가지고 이쓴데 sum()함수로 합계를 구하거나 

average()로 평균을 구하거나, max() 로 최댓값을 min()으로 최솟값을 구할 수 있습니다. 

우선 기본적으로 여기까지 습득한 뒤에 여러가지 기능은 추가로 문제에 출현할 때마다 알아보겠습니다! 

반응형