이번 시간에는 넘파이 라이브러리의 반올림 메서드인 np.round()에 대해 알아보겠습니다.
import numpy as np
반올림
np.around(a, decimals=0, out=None)
ndarray.round(decimals=0, out=None)
arr = np.random.uniform(-5, 5, (5, ))
print(arr)
#[-3.91435426 -2.37331785 3.101129 -2.00653001 -1.79948384]
around_arr1 = np.around(arr, 2)
print(around_arr1)
# [-3.91 -2.37 3.1 -2.01 -1.8 ]
around_arr2 = arr.round(2)
print(around_arr2)
# [-3.91 -2.37 3.1 -2.01 -1.8 ]
np.around() 메서드는 매개변수 decimals의 값으로 전달한 자리 수까지 반올림 한 결과를 표기합니다.
사실 반올림 메서드는 자주 사용하지 않습니다.
반올림을 하면 데이터가 지니고 있는 정보가 손실되기 때문입니다.
그래서 주로 깔끔한 출력 결과를 받아보기 위해 사용합니다.
scores = np.random.uniform(0, 100, (100, 5))
scores_mean = scores.mean(axis=0)
scores_std = scores.std(axis=0)
print(scores_mean)
# [43.34169539 49.39268037 42.93328704 51.04678402 47.47397595]
print(scores_std)
# [27.65517424 30.26880309 28.68696967 29.39116911 29.02340659]
print(scores_mean.round(2))
# [43.34 49.39 42.93 51.05 47.47]
print(scores_std.round(2))
# [27.66 30.27 28.69 29.39 29.02]
100명의 학생의 5개 과목별 점수 데이터를 예로 들겠습니다.
각 과목별 평균과 표준편차를 구한 결과 shape이 (5, )인 1차원 배열이 각각 생성되었습니다.
하지만 소수점 이후로 이어지는 수들이 많기 때문에 가독성이 떨어지는 문제가 있습니다.
이때 반올림을 하면 데이터를 한 눈에 알아볼 수 있게 됩니다.
올림
arr = np.random.uniform(-5, 5, (5, ))
print(arr)
# [ 4.18261764 -4.30639527 3.82827519 1.40429818 -0.07652369]
ceil = np.ceil(arr)
print(ceil)
# [ 5. -4. 4. 2. -0.]
np.ceil() 메서드는 올림 연산을 수행합니다.
기존 실수 형태의 값들을 정수화 하는 효과가 있습니다.
내림
arr = np.random.uniform(-5, 5, (5, ))
print(arr)
# [ 0.84566636 -4.99750364 4.82595534 -1.46036756 -4.903277 ]
floor = np.floor(arr)
print(floor)
# [ 0. -5. 4. -2. -5.]
np.floor() 메서드는 내림 연산을 수행합니다.
마찬가지로 기존 실수 형태의 값들을 정수화 하는 효과가 있습니다.
np.trunc()
arr = np.random.uniform(-5, 5, (5, ))
print(arr)
# [ 3.4623564 -4.89340989 -3.67264464 -4.06552141 4.95852583]
arr_trunc = np.trunc(arr)
print(arr_trunc)
# [ 3. -4. -3. -4. 4.]
np.trunc() 메서드는 반올림, 올림, 내림 연산을 하지 않습니다.
대신에 특정 자리 수 이하를 모두 절삭합니다.
np.round() 메서드 보다 자주 사용한다는 특징이 있습니다.
arr = np.random.uniform(-5, 5, (5, ))
print(arr)
# [-3.72908443 -2.03876197 3.75108542 -1.70066592 -2.04908598]
arr_trunc_where = np.where(arr >= 0, np.floor(arr), np.ceil(arr))
print(arr_trunc_where)
# [-3. -2. 3. -1. -2.]
arr_trunc = np.trunc(arr)
print(arr_trunc)
# [-3. -2. 3. -1. -2.]
np.where() 메서드를 사용해서 np.trunc() 메서드를 구현할 수 있습니다.
음수인 경우에는 올림, 0이상 정수인 경우에는 내림 연산을 수행하도록 조건을 걸어주면 됩니다.
arr = np.random.uniform(-5, 5, (5, ))
print(arr)
# [-2.33704222 -4.87207015 -3.11582939 -0.99444802 -3.17887301]
arr_trunc = np.trunc(arr * 10) * 0.1
print(arr_trunc)
# [-2.3 -4.8 -3.1 -0.9 -3.1]
소수점 이하 자리를 남기고 싶다면 약간의 트릭을 가미하면 됩니다.
예를 들어 소수점 첫째 자리까지만 남기고 싶으면 메서드 사용 전에 10을 곱하고 이후에 다시 10으로 나눠주면 됩니다.
이런 식으로 소수점 둘째 혹은 셋째 자리까지 남기고 싶으면 각각 10의 제곱과 세제곱을 곱하고 다시 나눠주면 됩니다.
arr = np.random.uniform(-5, 5, (5, ))
print(arr)
# [-2.56967196 -1.44566547 1.93593262 0.96154764 0.47755581]
arr_int = np.trunc(arr)
print(arr_int)
# [-2. -1. 1. 0. 0.]
arr_frac = arr - arr_int
print(arr_frac)
# [-0.56967196 -0.44566547 0.93593262 0.96154764 0.47755581]
정수와 소수 부분을 나눌 수도 있습니다.
마치며
이상으로 올림과 내림 그리고 반올림 연산을 도와주는 넘파이 배열 관련 API에 대해 알아봤습니다.
이와는 별개로 np.trunc() 메서드에 대해서도 알아봤는데요, 딥러닝 알고리즘을 만들 때 자주 활용되는 만큼 기억해두면 좋을 것 같습니다.
'파이썬・ML > numpy' 카테고리의 다른 글
넘파이 np.repeat(), np.tile() 배열 반복하기 (0) | 2023.06.16 |
---|---|
넘파이 np.hstack(), np.vstack(), np.concatenate() 배열 합치기 (0) | 2023.06.16 |
넘파이 배열의 차원 다루기 (0) | 2023.06.15 |
넘파이 벡터의 내적과 행렬의 곱셈 (0) | 2023.06.15 |
넘파이 정렬 메서드 알아보기 (0) | 2023.06.14 |