본문 바로가기
2학년 2학기/데이터 사이언스 입문

Numpy - Ufunc

by print_soo 2024. 9. 26.

ufunc유니버설 함수(Universal Function)의 약자이며, 넘파이에서 제공하는 빠르고 효율적인 벡터화된 연산을 지원하는 함수들이다. 단, 동일한 크기를 가진 배열끼리만 가능하다. (브로드 캐스팅으로 해결 가능!)

 

ufunc는 배열의 요소별(element-wise)로 작동하며, 일반적인 산술 연산, 비교 연산, 논리 연산 등을 포함해 다양한 수학적 연산을 빠르게 수행할 수 있다.

ufunc의 특징

  1. 배열 연산을 요소별로 빠르게 수행: 파이썬의 루프를 사용하지 않고도 배열 전체에 대해 연산을 빠르게 처리할 수 있다.
  2. 벡터화된 연산: 반복문 없이 배열 전체에 대해 연산을 수행함으로써 성능을 크게 향상시킨다.
  3. 브로드캐스팅 지원: 배열 간 크기가 다를 때도 자동으로 크기를 맞춰서 연산을 수행할 수 있다.

 

주요 ufunc 함수들:

  • 산술 연산: add, subtract, multiply, divide 등.
  • 수학 함수: sin, cos, exp, sqrt 등.
  • 비교 연산: greater, less, equal 등.
  • 논리 연산: logical_and, logical_or, logical_not 등.

1. 간단한 ufunc 예시: 배열 덧셈

넘파이에서는 + 연산자 자체도 ufunc로 구현되어 있지만, 명시적으로 np.add() 함수를 사용할 수 있다.

import numpy as np

# 두 배열 생성
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

# ufunc인 add 함수를 사용하여 두 배열의 요소별 덧셈 수행
result = np.add(arr1, arr2)
print("두 배열의 요소별 덧셈 결과:", result)

 

결과:

두 배열의 요소별 덧셈 결과: [5 7 9]

 


2. ufunc를 사용한 수학 연산 예시: 제곱근 구하기

# 배열 생성
arr = np.array([1, 4, 9, 16])

# ufunc인 sqrt 함수 사용하여 요소별 제곱근 구하기
sqrt_result = np.sqrt(arr)
print("요소별 제곱근 결과:", sqrt_result)

 

결과:

요소별 제곱근 결과: [1. 2. 3. 4.]

 


3. ufunc를 사용한 삼각 함수 예시: 사인 함수

# 배열 생성 (각도 값)
angles = np.array([0, np.pi/2, np.pi])

# ufunc인 sin 함수 사용하여 요소별 사인 값 계산
sin_result = np.sin(angles)
print("요소별 사인 값:", sin_result)

결과:

요소별 사인 값: [0. 1. 0.]

 


4. 비교 연산 ufunc 예시

# 두 배열 비교
arr1 = np.array([1, 2, 3])
arr2 = np.array([3, 2, 1])

# ufunc인 greater 함수로 두 배열의 요소별 비교 (arr1 > arr2)
greater_result = np.greater(arr1, arr2)
print("요소별 비교 결과 (arr1 > arr2):", greater_result)

결과:

요소별 비교 결과 (arr1 > arr2): [False False  True]

 

 

 


 

 

브로드캐스팅과 ufunc의 활용 ⭐️⭐️⭐️⭐️⭐️

넘파이의 ufunc는 크기가 다른 배열 간에도 연산을 지원하는 브로드캐스팅을 할 수 있다.

# 2x3 배열과 1x3 배열
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([1, 2, 3])

# 요소별 덧셈 (브로드캐스팅이 적용됨)
broadcast_result = np.add(arr1, arr2)
broadcast_result = np.add(arr2, 3)
print("브로드캐스팅 덧셈 결과:\n", broadcast1_result)
print("브로드캐스팅 덧셈 결과_scalar:\n", broadcast2_result)

결과:

브로드캐스팅 덧셈 결과:
 [[2 4 6]
  [5 7 9]]
  
브로드캐스팅 덧셈 결과:
  [4 5 6]

정리:

  • ufunc는 배열의 요소별 연산을 빠르게 수행하는 함수로, 산술 연산, 수학 연산, 비교 연산 등 다양한 작업을 할 수 있다.
  • 브로드캐스팅을 통해 크기가 다른 배열 간 연산도 가능하다.
  • 넘파이에서 기본적인 수학적/논리적 작업을 매우 빠르게 처리할 수 있게 도와준다.