Idealim
article thumbnail

/* 본 게시물은 ' 파이썬 라이브러리를 활용한 데이터 분석 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를 참고하길 바란다.


참고 자료

반응형
profile

Idealim

@Idealim

읽어주셔서 감사합니다. 잘못된 내용이 있으면 언제든 댓글로 피드백 부탁드립니다.