STUDY/ML DL

NumPy 기초 함수 정리: 수학 연산, 통계, axis

sed 2026. 5. 8. 22:47
SMALL

NumPy 주요 함수 정리

이번 글에서는 numpy에서 자주 사용하는 수학 함수, 통계 함수를 정리해보고자 한다.

numpy는 단순히 배열을 만드는 것뿐만 아니라, 배열 안의 값에 대해 여러 수학 연산을 한 번에 수행할 수 있다.

특히 딥러닝이나 데이터 분석에서는 배열 전체에 대해 계산을 수행하는 일이 많기 때문에 이런 함수들을 익혀두는 것이 중요하다.

 

기본 수학 함수

먼저 랜덤한 3행 3열 배열을 하나 만들어보자.

 

np.random.randn(3, 3)은 정규분포를 따르는 랜덤 값을 이용해 3행 3열 배열을 만든다. 실행할 때마다 값은 달라질 수 있다.

a = np.random.randn(3, 3)
print(a)

 

예시) 다음과 같은 배열이 만들어졌다.

[[ 0.03199567 -0.18005751 -0.43230345]
 [-1.40622151  0.1206567  -0.45301697]
 [ 1.1540787   0.89680133  0.23041576]]
 

 

 

np.abs()는 절댓값을 구하는 함수이다. 음수는 양수로 바뀌고, 양수는 그대로 유지된다.

print(np.abs(a))
[[0.03199567 0.18005751 0.43230345]
 [1.40622151 0.1206567  0.45301697]
 [1.1540787  0.89680133 0.23041576]]
 
 
 
 

np.sqrt()는 제곱근을 구하는 함수이다.

다만 음수에 바로 제곱근을 적용하면 문제가 생길 수 있으므로, 여기서는 먼저 np.abs(a)로 절댓값을 만든 뒤 제곱근을 구했다.

print(np.sqrt(np.abs(a)))
[[0.17887333 0.42433184 0.65749787]
 [1.18584211 0.34735673 0.67306536]
 [1.07428055 0.94699595 0.48001641]]
 

 

 

np.exp()는 지수함수이다. 즉, 각 원소에 대해 e^x를 계산한다. 여기서 e는 자연상수이며, np.exp(1)은 e^1을 의미한다.
print(np.exp(a))
[[1.03251303 0.83522217 0.64901241]
 [0.24506752 1.12823752 0.63570734]
 [3.17110054 2.45174823 1.25912339]]
 

딥러닝에서는 exp()가 softmax 함수 등을 계산할 때 자주 등장한다.

 

 

np.log()는 자연로그를 구하는 함수이다.

로그는 0 이하의 값에 적용할 수 없기 때문에, 여기서는 np.abs(a)를 사용해 양수로 바꾼 뒤 로그를 적용했다.

print(np.log(np.abs(a)))
[[-3.44215479 -1.71447896 -0.83862751]
 [ 0.34090633 -2.11480599 -0.79182569]
 [ 0.14330237 -0.10892092 -1.46786997]]
 
 

np.log10()은 밑이 10인 로그이고, np.log2()는 밑이 2인 로그이다.

print(np.log10(10))
print(np.log2(2))
1.0
1.0
 

즉, log10(10)은 1이고, log2(2)도 1이다.

 

 

np.round()는 반올림 함수이다.

두 번째 인자를 주지 않으면 정수 자리로 반올림하고, np.round(a, 2)처럼 쓰면 소수점 둘째 자리까지 반올림한다.

print(np.round(a))
print(np.round(a, 2))
[[ 0. -0. -0.]
 [-1.  0. -0.]
 [ 1.  1.  0.]]

여기서 -0.처럼 보이는 값은 실제로는 0에 매우 가까운 음수 값이 반올림된 결과이다.

[[ 0.03 -0.18 -0.43]
 [-1.41  0.12 -0.45]
 [ 1.15  0.9   0.23]]
 

 

np.floor()는 내림 함수이고, np.ceil()은 올림 함수이다.
print(np.floor(a))
print(np.ceil(a))
[[ 0. -1. -1.]
 [-2.  0. -1.]
 [ 1.  0.  0.]]
[[ 1. -0. -0.]
 [-1.  1. -0.]
 [ 2.  1.  1.]]
 

 

floor()는 자기보다 작거나 같은 정수로 내리고, ceil()은 자기보다 크거나 같은 정수로 올린다. 음수에서는 특히 헷갈릴 수 있는데, 예를 들어 floor(-1.4)는 -2가 된다.

 

 

 

삼각함수

numpy에서는 삼각함수도 사용할 수 있다.

print(np.sin(np.pi / 6))
print(np.cos(np.pi / 3))
print(np.tan(np.pi / 4))
print(np.tanh(-10))
 

출력 결과는 다음과 같다.

0.49999999999999994
0.5000000000000001
0.9999999999999999
-0.9999999958776927
 

np.pi는 원주율 π를 의미한다. 따라서 np.pi / 6은 30도, np.pi / 3은 60도, np.pi / 4는 45도에 해당한다.

 

원래 수학적으로는 sin(π/6) = 0.5, cos(π/3) = 0.5, tan(π/4) = 1이다.

그런데 출력값이 정확히 0.5나 1로 나오지 않는 이유는 컴퓨터가 실수를 근사값으로 계산하기 때문이다.

 

tanh()는 하이퍼볼릭 탄젠트 함수이다. 딥러닝에서 활성화 함수로 등장하는 함수이며, 출력값은 대체로 -1과 1 사이에 위치한다.

hyperbolic tangent

 

 

nan과 inf 확인하기

numpy에서는 결측값이나 무한대 값을 다룰 수도 있다.

np.nan
print(np.isnan([1, 2, np.nan, 3, 4]))
print(np.isinf([1, 2, 3, 4, np.inf]))
 

출력 결과는 다음과 같다.

[False False  True False False]
[False False False False  True]
 

np.nan은 Not a Number의 줄임말로, 숫자가 아니라는 의미이다. 주로 결측값을 표현할 때 사용된다.

 

np.isnan()값이 nan인지 확인한다.

위 예제에서는 세 번째 값이 np.nan이므로 해당 위치만 True가 된다.

 

np.inf는 무한대를 의미한다. np.isinf()는 값이 무한대인지 확인한다.

위 예제에서는 마지막 값이 np.inf이므로 마지막 위치만 True가 된다.

 

 

최댓값, 최솟값, argmax

이번에는 배열에서 최댓값과 최솟값을 구해보자.

a = np.random.randn(3, 4)
print(a)
 

예를 들어 다음과 같은 배열이 만들어졌다고 하자.

[[-0.7094617   1.78862055 -0.48704924 -1.13096987]
 [-1.19974115 -0.03486259  0.2524265   0.27446744]
 [-1.59490798  0.50362742  1.82277119 -0.44849658]]
 

 

np.max(a)는 배열 전체에서 가장 큰 값을 구한다.
print(np.max(a))
1.82277119390519
 

 

axis는 NumPy 배열에서 어느 방향으로 계산할 것인지 정하는 기준이다.

axis=0은 열 방향으로 비교한다. 이는 행 방향으로 내려가면서 계산해서 각 열마다 결과를 만든다는 뜻이다.
즉, 각 열에서 가장 큰 값을 구한다.
print(np.max(a, axis=0))
[-0.7094617   1.78862055  1.82277119  0.27446744]
 
 

반대로 axis=1은 열 방향으로 가로로 계산해서 각 행마다 결과를 만든다는 뜻이다.

즉, 각 행에서 가장 큰 값을 구한다.
 
keepdims=True를 사용하면 결과를 2차원 형태로 유지한다.
 
print(np.max(a, axis=1, keepdims=True))
[[1.78862055]
 [0.27446744]
 [1.82277119]]
 

 

axis는 처음에는 헷갈릴 수 있다. 간단히 정리하면 axis=0은 각 열을 기준으로 계산하고, axis=1은 각 행을 기준으로 계산한다고 이해하면 된다.

axis=0 → 세로로 비교 → 열마다 결과
axis=1 → 가로로 비교 → 행마다 결과

 

조금 더 정확히 말하면, axis는 없앨 축을 의미한다.
예를 들어 axis=0으로 계산하면 0번 축인 행 방향이 사라지고, 열 단위 결과만 남는다.

 
 

np.min()은 최솟값을 구하는 함수이다.

print(np.min(a))
print(np.min(a, axis=0))
print(np.min(a, axis=1))
-1.594907981573325
[-1.59490798 -0.03486259 -0.48704924 -1.13096987]
[-1.13096987 -1.19974115 -1.59490798]
 
 
np.argmax(a)는 가장 큰 값 자체가 아니라, 가장 큰 값이 위치한 인덱스를 반환한다.
print(np.argmax(a))
10
 

여기서 10이 나온 이유는 2차원 배열을 일렬로 펼쳤을 때 가장 큰 값이 10번째 위치에 있기 때문이다.

 

axis=0을 주면 각 열에서 가장 큰 값이 몇 번째 행에 있는지 반환한다.

print(np.argmax(a, axis=0))
[0 0 2 1]
 
axis=1을 주면 각 행에서 가장 큰 값이 몇 번째 열에 있는지 반환한다.
print(np.argmax(a, axis=1))
[1 3 2]
 

 

 

 

 

정렬하기

이번에는 배열을 정렬해보자.

a = np.random.randn(6, 1)
print(a)
 

예를 들어 다음과 같은 배열이 만들어졌다고 하자.

[[-0.10279341]
 [-0.69402409]
 [ 0.76914607]
 [-1.72665029]
 [ 0.75035491]
 [-0.51873519]]
 
 

np.sort()는 배열을 정렬하는 함수이다.

axis=0을 기준으로 정렬했기 때문에, 열 방향으로 오름차순 정렬된다.

a_sorted = np.sort(a, axis=0)
print(a_sorted)
[[-1.72665029]
 [-0.69402409]
 [-0.51873519]
 [-0.10279341]
 [ 0.75035491]
 [ 0.76914607]]
 

 

np.flipud()는 배열을 위아래로 뒤집는 함수이다. 따라서 오름차순 정렬된 결과를 뒤집으면 내림차순 정렬처럼 사용할 수 있다.

print(np.flipud(a_sorted))
[[ 0.76914607]
 [ 0.75035491]
 [-0.10279341]
 [-0.51873519]
 [-0.69402409]
 [-1.72665029]]
 
 
 
 

합계, 평균, 표준편차

배열의 합계와 평균도 쉽게 구할 수 있다.

a = np.random.randn(3, 4)
print(a)
 

예를 들어 다음과 같은 배열이 있다고 하자.

[[ 0.21944666 -0.95830192 -0.24526346 -0.20223772]
 [-0.45415487 -0.41667921 -0.90213768 -1.52134923]
 [ 1.8038691   1.30380143  0.26991339 -0.80116604]]
 
 

np.sum(a)는 배열 전체 원소의 합을 구한다.

print(np.sum(a))
-1.904259569992362
 
 

axis=1을 주면 각 행의 합을 구한다.

 
print(np.sum(a, axis=1))
[-1.18635644 -3.294321    2.57641787]
 
 

 

keepdims=True를 사용하면 결과를 2차원 배열 형태로 유지한다.
print(np.sum(a, axis=1, keepdims=True))
[[-1.18635644]
 [-3.294321  ]
 [ 2.57641787]]
 
 

np.mean()은 평균을 구하는 함수이다.

print(np.mean(a))
print(np.mean(a, axis=1))
print(np.mean(a, axis=1, keepdims=True))
-0.1586882974993635
[-0.29658911 -0.82358025  0.64410447]
[[-0.29658911]
 [-0.82358025]
 [ 0.64410447]]
 
 

np.std()는 표준편차를 구하는 함수이다.

표준편차는 값들이 평균으로부터 얼마나 퍼져 있는지를 나타낸다.

데이터 분석에서 분포의 흩어짐을 확인할 때 자주 사용된다.

print(np.std(a))
0.9102273619213624
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

LIST