NumPy 通用函數(shù)(ufunc)的實現(xiàn)
NumPy 中的通用函數(shù)(ufunc)是一類對數(shù)組元素進行逐元素操作的函數(shù),它們能高效地處理數(shù)組的數(shù)學運算、統(tǒng)計聚合與數(shù)組操作等任務,返回結(jié)果也是數(shù)組。下面我們針對常用的 ufunc 進行分類說明。
1 數(shù)學運算類 ufunc
1.1 指數(shù)函數(shù):np.exp()
計算數(shù)組中每個元素的自然指數(shù)(即
,其中
≈ 2.71828)。
代碼示例:
import numpy as np
B = np.arange(3) # 創(chuàng)建數(shù)組[0, 1, 2]
print("原始數(shù)組B:", B)
print("np.exp(B)的結(jié)果:", np.exp(B)) # 輸出[1. 2.71828183 7.3890561]1.2 平方根函數(shù):np.sqrt()
計算數(shù)組中每個元素的平方根。
代碼示例:
print("np.sqrt(B)的結(jié)果:", np.sqrt(B)) # 輸出[0. 1. 1.41421356]1.3 加法函數(shù):np.add()
對兩個數(shù)組執(zhí)行逐元素加法運算。
代碼示例:
C = np.array([2., -1., 4.])
print("原始數(shù)組C:", C)
print("np.add(B, C)的結(jié)果:", np.add(B, C)) # 輸出[2. 0. 6.]2 統(tǒng)計與聚合類 ufunc
這類函數(shù)用于對數(shù)組進行統(tǒng)計分析,如求極值、求和、求均值等。
2.1 最大值函數(shù):np.max()
返回數(shù)組中的最大值,也可通過數(shù)組方法 arr.max() 調(diào)用。
代碼示例:
arr = np.array([3, 1, 4, 1, 5])
print("數(shù)組最大值:", np.max(arr)) # 輸出52.2 最小值函數(shù):np.min()
返回數(shù)組中的最小值,也可通過數(shù)組方法 arr.min() 調(diào)用。
代碼示例:
print("數(shù)組最小值:", np.min(arr)) # 輸出12.3 求和函數(shù):np.sum()
計算數(shù)組所有元素的和,也可通過數(shù)組方法 arr.sum() 調(diào)用。
代碼示例:
print("數(shù)組元素和:", np.sum(arr)) # 輸出3+1+4+1+5=142.4 均值函數(shù):np.mean()
計算數(shù)組元素的算術(shù)平均值,也可通過數(shù)組方法 arr.mean() 調(diào)用。
代碼示例:
print("數(shù)組均值:", np.mean(arr)) # 輸出14/5=2.83 數(shù)組操作類 ufunc
這類函數(shù)用于對數(shù)組結(jié)構(gòu)或元素順序進行操作。
3.1 排序函數(shù):np.sort()
對數(shù)組元素進行排序(返回新數(shù)組,原數(shù)組不變)。
代碼示例:
arr = np.array([5, 2, 9, 1, 7])
sorted_arr = np.sort(arr)
print("排序后數(shù)組:", sorted_arr) # 輸出[1 2 5 7 9]3.2 索引排序函數(shù):np.argsort()
返回數(shù)組元素排序后的索引位置(即原數(shù)組中元素從小到大的位置編號)。
【數(shù)組的索引】
在 NumPy 中,“索引” 是訪問、修改或篩選數(shù)組元素的關(guān)鍵方式,其功能豐富且靈活。和 Python 列表類似,一維數(shù)組的索引從 0 開始,可通過整數(shù)索引獲取單個元素,也能用切片(如arr[1:4])獲取連續(xù)區(qū)間的元素;對于多維數(shù)組,需用逗號分隔的索引元組來指定維度,比如二維數(shù)組 arr 可通過 arr[行索引, 列索引] 精準定位元素,也能對某一維度單獨切片(如 arr[:, 2] 獲取所有行的第三列)。此外,布爾索引更是便捷,通過構(gòu)造與原數(shù)組形狀相同的布爾數(shù)組(如arr > 10),可直接篩選出滿足條件的元素,這在數(shù)據(jù)清洗和分析中極為實用。簡言之,索引機制讓 NumPy 數(shù)組的元素操作既高效又靈活,是掌握 NumPy 數(shù)據(jù)處理能力的核心基礎(chǔ)之一。
代碼示例:
indices = np.argsort(arr)
print("排序索引:", indices) # 輸出[3 1 0 4 2],表示原數(shù)組第3個元素(1)最小,第1個元素(2)次之……3.3 非零元素查找:np.nonzero()
返回數(shù)組中非零元素的索引。
代碼示例:
arr = np.array([0, 2, 0, 5, 0])
nonzero_indices = np.nonzero(arr)
print("非零元素索引:", nonzero_indices) # 輸出(array([1, 3]),),表示第1、3個元素非零代碼示例中,(array([1, 3]),) 是 NumPy 中 np.nonzero() 函數(shù)返回的結(jié)果格式,本質(zhì)是一個包含 1 個 NumPy 數(shù)組的元組。
其中,元組內(nèi)的 array([1, 3]) 表示 “非零元素在數(shù)組中的索引位置”—— 比如當對一維數(shù)組 [0, 2, 0, 5, 0] 使用 np.nonzero() 時,數(shù)組中值不為 0 的元素(2 和 5)分別位于第 1 位和第 3 位(NumPy 索引從 0 開始),因此返回該索引數(shù)組;而外層的元組結(jié)構(gòu)是為了適配多維數(shù)組場景:若處理的是二維數(shù)組,np.nonzero() 會返回包含兩個數(shù)組的元組(分別對應非零元素的 “行索引” 和 “列索引”),即使是一維數(shù)組,也保持元組格式以保證接口一致性,末尾的逗號則是 Python 中單個元素元組的標準寫法(避免與普通括號混淆)。
然而,這里的難點在于對于多維數(shù)組的情況。
代碼示例:
# 創(chuàng)建一個形狀為(2, 3, 2)的三維數(shù)組
arr_3d = np.array([
[[0, 1], [2, 0], [0, 3]],
[[4, 0], [0, 5], [6, 0]]
])
nonzero_indices = np.nonzero(arr_3d)
print("非零元素的三維索引:", nonzero_indices)上述代碼運行后會輸出:
非零元素的三維索引: (array([0, 0, 0, 1, 1, 1]), array([0, 1, 2, 0, 1, 2]), array([1, 0, 1, 0, 1, 0])) 。
我們可以對 arr_3d,逐個找出非零元素的位置,就能明白這個結(jié)果是怎么來的了。
arr_3d 的形狀是 (2, 3, 2),可以理解為 “2 個深度層,每個深度層有 3 行、2 列”,具體結(jié)構(gòu)如下:
# 深度0的層(arr_3d[0]): [ [0, 1], # 行0:列0是0,列1是1(非零) [2, 0], # 行1:列0是2(非零),列1是0 [0, 3] # 行2:列0是0,列1是3(非零) ] # 深度1的層(arr_3d[1]): [ [4, 0], # 行0:列0是4(非零),列1是0 [0, 5], # 行1:列0是0,列1是5(非零) [6, 0] # 行2:列0是6(非零),列1是0 ]
接下來,我們逐個找出所有非零元素,并記錄它們的 “三維坐標”(深度索引,行索引,列索引):
深度 0、行 0、列 1 的元素是 1(非零)→ 坐標 (0, 0, 1)
深度 0、行 1、列 0 的元素是 2(非零)→ 坐標 (0, 1, 0)
深度 0、行 2、列 1 的元素是 3(非零)→ 坐標 (0, 2, 1)
深度 1、行 0、列 0 的元素是 4(非零)→ 坐標 (1, 0, 0)
深度 1、行 1、列 1 的元素是 5(非零)→ 坐標 (1, 1, 1)
深度 1、行 2、列 0 的元素是 6(非零)→ 坐標 (1, 2, 0)
現(xiàn)在,把這 6 個坐標按順序拆分:
所有坐標的 “深度索引” 提取出來:0, 0, 0, 1, 1, 1 → 組成第一個數(shù)組 array([0, 0, 0, 1, 1, 1])
所有坐標的 “行索引” 提取出來:0, 1, 2, 0, 1, 2 → 組成第二個數(shù)組 array([0, 1, 2, 0, 1, 2])
所有坐標的 “列索引” 提取出來:1, 0, 1, 0, 1, 0 → 組成第三個數(shù)組 array([1, 0, 1, 0, 1, 0])
這三個數(shù)組組合起來,就是 np.nonzero(arr_3d) 的返回結(jié)果,每個位置上的三個值對應一個非零元素的完整坐標。比如第 0 個位置的三個值 (0,0,1),就對應第一個非零元素 arr_3d[0,0,1] = 1。
4 總結(jié)
NumPy 的通用函數(shù)(ufunc)是數(shù)組運算的核心工具,涵蓋數(shù)學運算、統(tǒng)計分析、數(shù)組操作等多個場景。掌握這些常用 ufunc,能讓你在數(shù)值計算中高效處理數(shù)組任務,為數(shù)據(jù)分析、科學計算等工作奠定基礎(chǔ)。
到此這篇關(guān)于NumPy 通用函數(shù)(ufunc)的實現(xiàn)的文章就介紹到這了,更多相關(guān)NumPy 通用函數(shù)ufunc內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用jupyter notebook運行python和R的步驟
這篇文章主要介紹了使用jupyter notebook運行python和R的步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
詳細解讀Python的web.py框架下的application.py模塊
這篇文章主要介紹了Python的web.py框架下的application.py模塊,作者深入分析了web.py的源碼,需要的朋友可以參考下2015-05-05
PID原理與python的簡單實現(xiàn)和調(diào)參
這篇文章主要介紹了PID原理與python的簡單實現(xiàn)和調(diào)參文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值。感興趣的小伙伴可以參考一下2022-08-08
python 環(huán)境變量和import模塊導入方法(詳解)
下面小編就為大家?guī)硪黄猵ython 環(huán)境變量和import模塊導入方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
Broadcast廣播機制在Pytorch Tensor Numpy中的使用詳解
python中Broadcast機制非常實用,在python中的廣播機制其實很簡單,下方主要介紹Broadcast廣播機制在Pytorch Tensor Numpy中的使用,希望對你有所幫助2022-08-08

