Skip to content

ufunc簡介

在 NumPy 中,ufunc(Universal Function, 通用函數)對陣列執行向量化運算的函數,可大幅提升計算速度,避免使用慢速的 Python for 迴圈。


✅ 1. ufunc 的基本概念

「普通 Python 運算」(效率低,使用 for 迴圈):

import numpy as np

lst = [1, 2, 3, 4]
result = [x ** 2 for x in lst]  # 使用 for 迴圈計算
print(result)  # [1, 4, 9, 16]

「使用 ufunc 向量化計算」(高效運算):

arr = np.array([1, 2, 3, 4])
result = np.square(arr)  # 直接對整個陣列平方
print(result)  # [1 4 9 16]

ufunc 直接對 NumPy 陣列運算,比 for 迴圈快很多!


✅ 2. NumPy 內建的 ufunc

🔹 常見的數學 ufunc

ufunc 函數 功能 範例
np.add(x, y) 陣列加法 np.add([1, 2], [3, 4]) → [4 6]
np.subtract(x, y) 陣列減法 np.subtract([5, 6], [3, 2]) → [2 4]
np.multiply(x, y) 陣列乘法 np.multiply([2, 3], [3, 4]) → [6 12]
np.divide(x, y) 陣列除法 np.divide([6, 9], [3, 3]) → [2. 3.]
np.power(x, y) 指數運算 np.power([2, 3], 2) → [4 9]
np.sqrt(x) 平方根 np.sqrt([4, 9]) → [2. 3.]
np.exp(x) 指數函數 np.exp([1, 2]) → [2.718 7.389]
np.log(x) 自然對數(ln) np.log([1, np.e]) → [0 1]
np.abs(x) 絕對值 np.abs([-1, -2, 3]) → [1 2 3]

🔹 例子

arr = np.array([1, 4, 9, 16])
print(np.sqrt(arr))  # [1. 2. 3. 4.]

✅ 3. 三角函數 ufunc

arr = np.array([0, np.pi / 2, np.pi])
print(np.sin(arr))  # [0. 1. 0.]
print(np.cos(arr))  # [1. 0. -1.]
print(np.tan(arr))  # [0. 1.6e16 0.] (π 時可能有浮點誤差)

✅ 4. 陣列的 ufunc 運算

ufunc 可以對 陣列廣播 運算:

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

print(np.add(arr1, arr2))  # [5 7 9]
print(np.multiply(arr1, arr2))  # [4 10 18]
print(np.power(arr1, 2))  # [1 4 9]

適用於大型數據計算,不用 for 迴圈也能高效計算!


✅ 5. 自定義 ufunc

NumPy 允許使用 np.frompyfunc() 來建立自訂的 ufunc

def my_func(x, y):
    return x * y + 2

# 建立 ufunc
ufunc_custom = np.frompyfunc(my_func, 2, 1)

# 測試
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

print(ufunc_custom(arr1, arr2))  # [6 12 20]

frompyfunc(my_func, input數量, output數量) 可自訂函數並對陣列計算。


📌 總結

功能 ufunc 用法
基本運算 np.add(x, y), np.subtract(x, y), np.multiply(x, y), np.divide(x, y)
指數/對數 np.power(x, y), np.sqrt(x), np.exp(x), np.log(x)
三角函數 np.sin(x), np.cos(x), np.tan(x)
陣列運算 ufunc 會對所有元素計算,不需 for 迴圈
自訂 ufunc np.frompyfunc(my_func, input數量, output數量)

🚀 ufunc 是 NumPy 最強大的功能之一,它可以幫助我們高效處理數據並提高計算速度! 😊