저번 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을 다뤄보려고 한다.
'Studying > Machine Learning' 카테고리의 다른 글
[머신러닝] Linear regression(선형 회귀) 구현 (0) | 2022.07.05 |
---|---|
[머신러닝] 파이썬 Numpy 연산 - Numpy dot, matmul, transpose (1) | 2022.06.25 |
[머신러닝] 파이썬 Numpy - Numpy의 유용한 기능들 (0) | 2022.06.23 |
[머신러닝] 파이썬 Numpy - Numpy indexing과 slicing (0) | 2022.06.21 |
[머신러닝] 파이썬 Numpy - Numpy 모듈 기본 및 ndarray 이해 (0) | 2022.06.15 |
댓글