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
向量化計算」(高效運算):
✅ 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] |
🔹 例子
✅ 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 最強大的功能之一,它可以幫助我們高效處理數據並提高計算速度! 😊