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

Numpy - Ufunc

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