/* 본 게시물은 ' 파이썬 라이브러리를 활용한 데이터 분석 2판 | with 웨스 맥키니 ' 의 내용과 참고자료를 토대로 작성되었습니다. */
/* 본 글은 개인적으로 공부한 내용을 정리한 글이므로 오류가 있을 수 있습니다. */
유니버셜 함수
유니버셜 함수(ufunc)는 ndarray 안에 있는 데이터 원소별로 연산을 수행하는 함수이다. 유니버설 함수는 하나 이상의 스칼라값을 받아서 하나 이상의 스칼라 결과값을 반환하는 간단한 함수를 고속으로 수행할 수 있는 벡터화된 래퍼 함수이다. (결론: 빠르다)
ufunc의 예시로 sqrt(제곱근) / exp(지수함수) 같은 간단한 변형을 전체 원소에 적용할 수 있다. 유니버셜 함수에 대해 자세히 알아보자.
1. 단항 유니버셜 함수
단항 유니버셜 함수는 인자를 한개 받는 함수이다. 대표적인 예로 sqrt / exp 함수가 있다.
Data
arr = np.arange(10)
Sqrt
# 제곱근
print(np.sqrt(arr))
"""
[0. 1. 1.41421356 1.73205081 2. 2.23606798
2.44948974 2.64575131 2.82842712 3. ]
"""
Exp
# 지수
print(np.exp(arr))
"""
[1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+01
5.45981500e+01 1.48413159e+02 4.03428793e+02 1.09663316e+03
2.98095799e+03 8.10308393e+03]
"""
2. 이항 유니버셜 함수
이름에서 알 수 있듯이 인자를 두 개가 필요하고 단일 배열을 반환하는 함수는 이항 유니버셜 함수라고 한다. 대표적인 예로 add 함수나 maximum 등이 있다.
maximum
x = np.random.randn(8)
y = np.random.randn(8)
print(x, y)
"""
[-0.87327795 -1.37218236 -0.19663291 -0.06447446 0.83477273 1.45233578
-0.25698008 -0.02836231]
[-0.30226923 -1.13828882 0.88816069 0.68024821 0.50622949 -0.97953953
-0.45445381 2.935231 ]
[-0.30226923 -1.13828882 0.88816069 0.68024821 0.83477273 1.45233578
"""
# x, y 각 element마다 최댓값 출력
print(np.maximum(x, y))
"""
[-0.30226923 -1.13828882 0.88816069 0.68024821 0.83477273 1.45233578
-0.25698008 2.935231 ]
"""
modf
modf 함수는 파이썬 내장 함수인 divmod의 벡터화 버전으로 분수를 받아서 몫과 나머지를 함께 반환한다.
arr = np.random.randn(7) * 5
"""
[-16.31543388 -0.7823552 -7.0904366 0.74358893 1.05073524
3.41260792 0.71041558]
"""
# modf() : 분수를 받아서 몫과 나머지를 함께 반환한다.
remainder, whole_part = np.modf(arr)
print(remainder)
print(whole_part)
"""
[-0.31543388 -0.7823552 -0.0904366 0.74358893 0.05073524 0.41260792
0.71041558]
[-16. -0. -7. 0. 1. 3. 0.]
"""
유니버셜 함수는 계산 결과를 변수에 따로 저장할 수 있다.
이 게시물에서 다루지 않은 많은 Ufunc 은 Numpy Document를 참고하길 바란다.
참고 자료
[Numpy Docoument - ufunc] : https://numpy.org/doc/stable/reference/ufuncs.html