무효 클릭 IP 추적 중...
머신러닝,딥러닝/넘파이,numpy

[넘파이 기초] 반올림, 올림, 버림

꼬예 2021. 4. 27.

이번시간에는 넘파이를 이용해 반올림, 올림, 버림을 어떻게하는지, 그리고 소수점 몇째자리까지 나오게 하고싶을때 어떻게  하는지 알아보도록 하겠습니다. 

 

 

 

 

반올림(np.around/ np.round/ x.round)

import numpy as np

x = np.random.uniform(-5, 5, (5,))
# 반올림의 다양한 표현
np_around = np.around(x, decimals =2) 
np_round  = np.round(x, decimals=2)
x_round = x.round(decimals=2) 

print(f"x: n {x}\n")

print(f"np_around: \n {np_around}")
print(f"np_round: \n {np_round}")
print(f"x_round: \n {x_round}")

output :

반올림은 위와 같이 3가지 형태로 사용할 수 있는데요, 이때 주의할점은 decimals = 2라는 의미가 소수점 둘째자리에서 반올림하는것이 아니라 연산결과가 둘째자리까지 나온다는 것을 의미하니까 주의 하세요!

 

참고로 decimal을 적용하지 않은 디폴트 값은 0 입니다. 

import numpy as np

x = np.random.uniform(-5, 5, (5,))
# 반올림의 다양한 표현
np_around = np.around(x) # 디폴트는 0 임
np_round  = np.round(x)
x_round = x.round() 

print(f"x: n {x}\n")

print(f"np_around: \n {np_around}")
print(f"np_round: \n {np_round}")
print(f"x_round: \n {x_round}")

output :

결과를 보시면 아시겠지만 정수부분만 나오는것을 확인할 수 있습니다. 

 

 

 

 

 

올림 / 내림(np.ceil / np.floor)

import numpy as np

x = np.random.uniform(-5, 5, (5,))

ceil = np.ceil(x)
floor = np.floor(x)

print(f"x: n {x}\n")

print(f"ceil: \n {ceil}") # 올림
print(f"floor: \n {floor}") # 내림

output :

celing이 천정을 뜻하고 floor을 바닥을 뜻하는 것처럼, 올림을 하고싶을땐 np.ceil 내림을 하고싶을땐 np.floor 을 이용해주면됩니다. 양수 같은 경우 대부분의 분들이 잘하시는데, 마이너스 같은경우는 실수하는 분들이 많아 되짚어보고 가겠습니다..

.

올림의 정의 자체가 입력값과 같거나 큰 정수중 가장 가까운값입니다. 
즉, 양수일때는  그냥 소수점 버리고 정수자리에 1를 더하는 형태이죠
반면 내림의 정의입력값과 같거나 작은 정수중 가장 가까운 값을 의미합니다. 
즉 양수일때는 소수점만 버리면 내림형태가 됩니다. 
문제는 마이너스인데요, 양수일때랑 다르니 많은 실수가 일어납니다. 이때는 정의를 생각하시고 머리에 이미지를 생각하시면 헷갈리지 않을겁니다.. 아래와 그림과 함께 보시죠!

 

 

위그림에서   -4.92268804의 올림을 적용하고자합니다.

정의를 생각해볼까요? -4.92268804와 같거나 큰 정수중 가장 가까운값이 무엇일까요?

그림을 보면 명백합니다. -5가 아니라 -4이죠!

 

이번에는 내림을 적용해볼까요?

-4.92268804와 같거나 작은 정수중 가장 가까운값이 무엇일까요?

바로 -5입니다. 

 

헷갈릴때마다 정의를 생각하시면 실수를 줄이실 수 있을겁니다!

 

 

버림(np.trunc())

"나는 올림과 내림처럼 복잡한거 싫다!" 음수이던 양수이던 상관없이 뒤에 소수점 을 날리겠다! 라고 하실때 쓰는것이 이 truncation function 입니다. 

 

import numpy as np

x = np.random.uniform(-5, 5, (5,))

trunc = np.trunc(x)

print(f"x: n {x}\n")

print(f"trunc: \n {trunc}") 

output :

 

위 코드처럼 np.trunc()를 통해 간단하게 구현하실 수 있습니다. 

 

+ np.where api를통한 np.trunc()적용해보기

넘파이를 공부할때 있어서 api를 사용하는 법을 익히는것도 중요하지만, api없이도 내가 원하는 기능을 구현하는 능력또한 중요합니다. 

 

np.where와 np.floor, np.ceil을 가지고 np.trunc()기능을 구현해보겠습니다. 

 

import numpy as np

x = np.random.uniform(-5, 5, (5,))

trunc_where = np.where(x >=0, np.floor(x), np.ceil(x)) 
trunc = np.trunc(x)
print(f"x: n {x}\n")

print(f"trunc_where: \n {trunc_where}") 
print(f"trunc: \n {trunc}") 

output :

 

np.where는 np.nonzero와 마찬가지로 배열의 True인 곳의 인덱스를 반환하는 함수입니다. 

이코드에서 nonzero 다른 기능이 등장하는데요! 

바로 조건절(여기선 x>=0) 뒤에 np.floor(x)가 있는 위치는 x>=0 을 만족하는 부분을 내림하겠다는 의미이고 반대로 x>=0을 만족하지 않는 부분 올림하겠다는 의미입니다.

즉 2번째위치는 True인 인덱스 부분에 대한 연산, 3번째 위치는  False인 인덱스 부분에 대한 연산을 의미합니다.

근데 그게 버림이랑 무슨관련일까요?

 

잘생각해보십시오. 버림은 무조건 소수점을 날리는겁니다. 

x>=0이 참일때의 값들은 모두 양수죠? 소수점을 없애버리기 위해선 그냥 내림을 해도 됩니다. 

반면 x>=0이 거짓일때라는 말은, 다시말하면 x<0  음수를 말하는겁니다. 음수일때는 어떻게 해야 소수점만 없앨수 있을까요? 올림을 해야 합니다. 이게 헷갈린다면 올림, 내림 파트에 그림을 다시한번 보고 오시기 바랍니다. 

 

결과를 보시면 trunc api를 사용한것과 같은 결과를 확인하 실 수 있습니다.

 

+ trunc는 반올림 같이 소수점 몇째 자리에서 버림하는 기능이 없을까?

 

아쉽게도 인자를 통한 기능은 구현되어있지 않습니다. 

하지만 간단한 조작을 통해 가능하니 함께 배워보겠습니다. 

 

import numpy as np

x = np.random.uniform(-5, 5, (5,))

print(x)
# 소수점 첫재짜리까지만 나오게 하고 싶다면..
trunc = 0.1*np.trunc(10*x) # 10을 곱한후 나머지수는 다날린다음. 다시 10으로 나눠주면 됨.
print(trunc)

output :

위 예에서 보듯 소수점 첫째자리까지는 살리고 싶다면, 10을 곱해서 소수점첫째짜리가 정수가 되게 만들어줍니다. 

그다음 trunc을 실행하면 소수점은 날라가겠죠?

다시 값을 원상 복귀해줘야하니 10을 다시 나눠줍니다.

 

마찬가지로 소수점 둘째짜리까지 살리고싶다면 100을 곱한후 trunc를 실행하고 다시 100으로 나눠주면됩니다. 

 

 

 

 

 

이글과 읽으면 좋은글

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글