2022년 12월 11일 일요일

파이썬 math (nextafter, ulp, gcd, lcm) (3.9이상)

 

math update

파이썬 3.9 math함수들이 업데이트 되었습니다 이번에는 이 변경점들에 대해서 알아보도록 하겠습니다.

nextafter, ulp

파이썬 3.9에 추가된 이 함수는 부동소수점에서 나타낼 수 있는 가장 작은 다음 값을 찾아줍니다. (Java에도 동일한 이름의 함수가 존재합니다.)

진정한 실수(floating point)에서는 두 수사이에 무한대 개수의 값이 있지만, 실제 컴퓨터는 이것은 floating point를 표현하는 방법이 IEEE-754 기반으로 표현하기때문에, 유한개의 숫자가 존재하고, 이중 가장 근접한 값을 찾아주는 함수입니다. 파이썬 뿐 아니라 대부분의 언어들이 IEEE-754로 floating point를 처리하기 때문에 비슷한 부분이 있습니다.

마찬가지로 ulp함수도, 유효숫자기반의 가장 작은 숫자, 즉 오차범위을 알려줍니다. y를 향한 x 다음의 부동 소수점 값을 반환합니다. x가 y와 같으면, y를 반환합니다.

다음 예제를 참고 바랍니다 아래와 같이 특정 숫자의 가장 작게 차이는

from math import nextafter, ulp

print (nextafter(2,3)) # 2와 3사이의 next floating point value
# 2.0000000000000004

print (nextafter(6,10))
# 6.000000000000001

print (nextafter(0,9))
#5e-324
print (nextafter(9,0))
#8.999999999999998

ulp함수를 찍어보면,

print (ulp(3))
print (ulp(3.14159265))
# 4.440892098500626e-16
# 4.440892098500626e-16
print (ulp(100_000_000_000_000_000))
print (ulp(10_000_000_000_000_000))
print (ulp(10_000_000_000_000))
print (ulp(10_000_000_000))

# 16.0
# 2.0
# 0.001953125
# 1.9073486328125e-06

ulp함수를 찍어보면, 큰 수일 수록 한틱이 움직일때 같이 움직이는 ulp숫자가 커지는 것을 확인할 수가 있습니다. 반대로 수가 작으면 작을 수록 유효한 한틱이 작아지기때문에 그 range만큼 같이 움직이는 것을 볼 수가 있습니다.

이 함수는 정밀도가 높은 연산을 할 때, 이때의 오차 범위를 계산할 수 있습니다

gcd(최대공약수), lcm(최소공배수)

기존 파이썬 버전의 최대공약수, 최소공배수를 구하는 gcd, lcm 함수는 인자를 2개밖에 받지 못하였는데, 3.9버전 부터는 인자가 여러개 되어도 문제 없이 동작합니다.

from math import lcm, gcd

print (gcd(12,60,84)) # 12
print (gcd(24,18,12)) # 6
print (lcm(3,4,5)) # 60 

위와 같이 math함수 변경점에 대해서 알아 보았습니다.

2022년 12월 4일 일요일

Numpy Array Join (hstack , vstack)

이번에는 Array Join은 Array를 붙이는 방법을 설명합니다. NumPy에서는 스택 개념을 사용하여 이와 관련하여 여러 기능을 제공합니다. vstack과 hstack이 사용됩니다 아럐 예제를 보면 간단합니다. vstack은 위아래로 쌓습니다. hstack의 경우는 좌우로 확장을 해갑니다.

import numpy as np

A = np.ones((3, 3))
B = np.zeros((3, 3))
print (np.vstack((A,B)))
print (np.hstack((A,B)))
'''
# vstack
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]
 [0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

# hstack
[[1. 1. 1. 0. 0. 0.]
 [1. 1. 1. 0. 0. 0.]
 [1. 1. 1. 0. 0. 0.]]
'''

여러 배열 사이에서 쌓기를 수행하는 두 가지 다른 함수는 column_stack() 및 row_stack()입니다. 이러한 기능은 이전의 두 기능과 다르게 작동합니다. 1차원 배열을 column으로 쌓을지 row방향으로 쌓을지를 정합니다.

import numpy as np

a = np.array([0, 1, 2])
b = np.array([3, 4, 5])
c = np.array([6, 7, 8])
print( np.column_stack((a, b, c)) )
print( np.row_stack((a, b, c)) )
'''
# column_stack
[[0 3 6]
 [1 4 7]
 [2 5 8]]

#row_stack
[[0 1 2]
 [3 4 5]
 [6 7 8]]
'''

이상으로 Numpy array join에 대해서 알아보았습니다.