NumPy的通用函數(ufunc)提供高性能的逐元素運算,支持向量化操作和廣播機制,能應用於數組的數學、邏輯和比較運算。ufunc可提高計算速度,避免低效的迴圈,並允許自定義函數以滿足特定需求。例如,ufunc實現加法比迴圈更高效。通過`frompyfunc`可創建自定義ufunc。判斷函數是否為u... ...
NumPy 通用函數(ufunc)
簡介
NumPy 通用函數(ufunc),代表“通用函數”,是一類用於對 ndarray
對象進行逐元素運算的高性能函數。ufunc 使 NumPy 能夠在底層高效地利用 C 語言實現向量化操作,從而顯著提高計算速度。
優勢
ufunc 的主要優勢體現在以下幾個方面:
向量化操作: ufunc 可以對整個數組進行逐元素運算,避免了使用迴圈語句遍歷每個元素的低效率操作。
廣播機制: ufunc 支持廣播機制,能夠自動將不同形狀的數組廣播為相同形狀,方便進行運算。
多種函數類型: ufunc 包含了豐富的數學運算、邏輯運算和比較運算等,涵蓋了常見的數據處理需求。
靈活擴展: ufunc 支持自定義函數,可以根據需求創建新的 ufunc 來滿足特定場景的運算需求。
基本概念
向量化: 將原本需要使用迴圈語句逐個處理元素的操作,改為對整個數組進行操作,稱為向量化。
廣播: 在 NumPy 中,運算符可以對不同形狀的數組進行運算,規則是將數組廣播為相同的形狀,具體規則由數組的維度和 shape
屬性決定。
示例
加法運算
使用迴圈:
import numpy as np
x = np.array([1, 2, 3, 4])
y = np.array([5, 6, 7, 8])
z = []
for i, j in zip(x, y):
z.append(i + j)
print(z)
使用 ufunc:
import numpy as np
x = np.array([1, 2, 3, 4])
y = np.array([5, 6, 7, 8])
z = np.add(x, y)
print(z)
解釋:
- 在第一個示例中,使用
zip()
函數將x
和y
數組中的元素一一對應,並使用append()
函數將計算結果存儲在z
列表中。 - 在第二個示例中,直接使用
np.add()
函數對x
和y
數組進行加法運算,並將結果存儲在z
數組中。
ufunc 的優勢在於,它可以避免使用迴圈語句,直接對整個數組進行操作,效率更高。
創建自定義 ufunc
NumPy 允許用戶創建自定義的 ufunc,以滿足特定場景的運算需求。
步驟如下:
- 定義要封裝的運算函數:
- 函數應接收任意數量的 ndarray 數組作為輸入參數。
- 函數應返回一個或多個 ndarray 數組作為輸出結果。
- 使用
frompyfunc()
函數將自定義函數轉換為 ufunc:frompyfunc()
函數接收以下參數:function
: 要轉換的自定義函數。inputs
: 輸入參數的數量。outputs
: 輸出結果的數量。dtype
: 可選參數,指定輸出數組的數據類型。
示例:創建自定義加法函數 myadd
:
import numpy as np
def myadd(x, y):
return x + y
myadd = np.frompyfunc(myadd, 2, 1)
print(myadd([1, 2, 3, 4], [5, 6, 7, 8]))
解釋:
myadd
函數定義了自定義的加法運算邏輯。np.frompyfunc()
將myadd
函數轉換為 ufunc,並指定其輸入參數為 2 個,輸出結果為 1 個。- 最後,調用
myadd
ufunc 對兩個數組進行加法運算。
判斷函數是否是 ufunc
可以使用 type()
函數檢查函數的類型,如果結果為 numpy.ufunc
,則該函數是 ufunc。
import numpy as np
print(type(np.add))
練習
- 使用 ufunc 實現數組的平方和平方根運算。
- 創建自定義 ufunc,用於計算兩個數組的元素之積並返回最大值。
- 比較使用 ufunc 和迴圈語句進行數組運算的性能差異。
解決方案
import numpy as np
import time
# 1. 使用 ufunc 實現數組的平方和平方根運算
x = np.random.rand(10000)
## 最後
為了方便其他設備和平臺的小伙伴觀看往期文章:
微信公眾號搜索:`Let us Coding`,關註後即可獲取最新文章推送
看完如果覺得有幫助,歡迎點贊、收藏、關註