본문 바로가기
Studying/Machine Learning

[머신러닝] 파이썬 Numpy - Numpy 모듈의 수학적 기능들

by giem 2022. 6. 20.
반응형

저번 Numpy 포스팅에 이어서

2022.06.15 - [Studying/Machine Learning] - [머신러닝] 파이썬 - Numpy 모듈 기본 및 ndarray 이해

 

이번엔 numpy 모듈의 수학적 연산 기능들을 살펴보려고 한다.

 

기본적인 수학 함수먼저 알아보자.

 

 - log, exp, sin

a = np.arange(5, 50, 5)

np.log(a) # 자연로그(ln)
#array([1.60943791, 2.30258509, 2.7080502 , 2.99573227, 3.21887582,
#       3.40119738, 3.55534806, 3.68887945, 3.80666249])

np.exp(a) # 자연상수 e의 a승
#array([1.48413159e+02, 2.20264658e+04, 3.26901737e+06, 4.85165195e+08,
#       7.20048993e+10, 1.06864746e+13, 1.58601345e+15, 2.35385267e+17,
#       3.49342711e+19])

np.sin(a) # 싸인함수
#array([-0.95892427, -0.54402111,  0.65028784,  0.91294525, -0.13235175,
#       -0.98803162, -0.42818267,  0.74511316,  0.85090352])

위까지는 그냥 함수를 적용하는 것이였다.

 


이 구분선 아래부터가 이해하기 살짝 어려운 부분이다.

 

- sum

x = ([
      [ [5, 10, 15, 20, 25], 
        [30, 35, 40, 45, 50] ],
      [ [55, 60, 65, 70, 75], 
       [80, 85, 90, 95, 100] ] 
     ])
x = np.array(x)

print(x.shape) # x의 shape는 (2,2,5)

print(x.sum(axis = 2)) # 2번 axis를 기준으로 합쳐서 (2,2)로 줄어듬
#array([[ 75, 200],
#       [325, 450]])

print(x.sum(axis = -1)) # 여기서 -1은 끝에서 첫 번째, 즉, 2번 축을 의미
#array([[ 75, 200],
#       [325, 450]])

print(x.sum(axis = (1,2)).shape)
# 값은 [275, 775], shape는 (2, )가 됨

axis 기준으로 다 합치는 sum을 알아보았다.

 

머릿속으로 잘 안 그려져서 이해가 잘 안 될 수 있는데

min으로 보면 이해가 좀 더 쉬울 것 같다.

 

- min

print(x.min(axis = 0))
#array([[ 5, 10, 15, 20, 25],
#       [30, 35, 40, 45, 50]])

print(x.min(axis = (1,2)))
#array([ 5, 55])

간단하게 생각하면 가장 바깥쪽 괄호가 0번째 축, 들어갈수록 1, 2번째 축이라고 생각하면 쉽다.

 

첫번째 예제의 0번 axis 기준으로 min을 한 예제를 보자.

 

가장 바깥의 괄호로 보면 (5~50), (55~100)으로 묶이는데 더 작은 (5~50)을 출력한 것이다.

 

여러 축으로 sum, min을 하며 axis에 익숙해 지는게 좋을 것 같다.

 


위의 부분이 익숙해졌다고 가정하고 다른 유용한 함수들을 정리해보겠다.

 

- cumsum

cumsum은 해당 axis를 따라 누적합을 구한다.

print(x.cumsum(axis = -1)) 
#array([[[  5,  15,  30,  50,  75],
#        [ 30,  65, 105, 150, 200]],
#       [[ 55, 115, 180, 250, 325],
#        [ 80, 165, 255, 350, 450]]])

 

 

 

- argmin, argmax

argmin과 argmax는 해당 축에서 각각 가장 작은 혹은 가장 큰 원소가 있는 index를 반환한다.

x = ([
      [ [5, 10, 15, 20, 25], 
        [30, 35, 40, 45, 50] ],
      [ [55, 60, 65, 70, 75], 
       [80, 85, 90, 95, 100] ] 
      ])
x = np.array(x)

print(x.argmin(axis = 0))
# array([[0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0]])

print(x.argmax(axis = 0))
# array([[1, 1, 1, 1, 1],
#        [1, 1, 1, 1, 1]])

print(x.argmin(axis = -1))
# array([[0, 0],
#        [0, 0]])

print(x.argmax(axis = -1))
# array([[4, 4],
#        [4, 4]])

 

- repeat

repeat은 주어진 ndarray를 사용자가 원하는 횟수만큼 반복한 ndarray를 반환합니다.

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

print(a.repeat(3, axis = -1))
# array([[1, 1, 1, 2, 2, 2, 3, 3, 3],
#        [4, 4, 4, 5, 5, 5, 6, 6, 6]])

print(a.repeat(3, axis = 0))
# array([[1, 2, 3],
#        [1, 2, 3],
#        [1, 2, 3],
#        [4, 5, 6],
#        [4, 5, 6],
#        [4, 5, 6]])

 

- tile

tile은 repeat과 마찬가지로 반복을 위한 함수이나 repeat과는 다른 용도로 사용합니다.
reps로 각 축 마다 반복할 횟수를 입력을 받습니다.

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

print(np.tile(a, 3))
# array([[1, 2, 3, 1, 2, 3, 1, 2, 3],
#        [4, 5, 6, 4, 5, 6, 4, 5, 6]])

print(np.tile(a, reps=[3,2]))
# array([[1, 2, 3, 1, 2, 3],
#        [4, 5, 6, 4, 5, 6],
#        [1, 2, 3, 1, 2, 3],
#        [4, 5, 6, 4, 5, 6],
#        [1, 2, 3, 1, 2, 3],
#        [4, 5, 6, 4, 5, 6]])

 

- expand_dims

np.expand_dims로 ndarray의 차원을 추가할 수 있다.

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

b = np.expand_dims(a, axis = 0)

print((a, a.shape))
# (array([[1, 2, 3],
#        [4, 5, 6]]), (2, 3))

print((b, b.shape))
# (array([[[1, 2, 3],
#         [4, 5, 6]]]), (1, 2, 3))

 

- concatenate

concatenate는 주어진 ndarray 여러 개를 axis 기준으로 연결한다.

이 함수는 개인적으로 특히 자주 쓰는 것 같다.

a = np.array([[1,2,3],
              [4,5,6]]
              )
b = np.array([[10,20,30],
              [40,50,60]]
              )
c = np.array([[100,200,300],
              [400,500,600]]
              )

print(np.concatenate((a,b,c), axis = -1))
# array([[  1,   2,   3,  10,  20,  30, 100, 200, 300],
#        [  4,   5,   6,  40,  50,  60, 400, 500, 600]])

print(np.concatenate((a,b,c), axis = 0))
# array([[  1,   2,   3],
#        [  4,   5,   6],
#        [ 10,  20,  30],
#        [ 40,  50,  60],
#        [100, 200, 300],
#        [400, 500, 600]])

 

여기까지 Numpy의 유용한 함수를 알아보았다.

 

다음 포스팅에서는 Numpy의 꽃(?)이라고 할 수 있는 indexing과 slicing을 다뤄보려고 한다.

반응형

댓글