在數據分析、科學計算以及機器學習中,經常需要對數組中的數據進行訪問、提取或重新排列。例如:選取部分元素、按條件篩選數據、獲取某些位置的元素或改變數組維度結構等。
NumPy 提供了一組與數組索引、切片以及位置選擇相關的函數,用于完成這些操作。這些函數能夠以向量化方式高效處理數組數據,并避免 Python 循環帶來的性能損失。
按照功能劃分,NumPy 中與數組索引與切片相關的常用函數通常可以分為以下幾類:
(1)索引位置獲取
(2)條件索引
(3)元素提取與選擇
(4)索引變換與坐標轉換
(5)軸與維度操作
一、索引位置獲取
argmax()
返回數組中最大值所在的索引位置。
numpy.argmax(a, axis=None)參數說明:
? a:輸入數組
? axis:沿指定軸返回最大值所在的索引,默認為 None
示例 1:
# 3說明:數組中最大值為 8,其索引位置為 3。
示例 2:指定軸
# [1 0]argmin()
返回數組中最小值所在的索引位置。
numpy.argmin(a, axis=None)參數說明:
? a:輸入數組
? axis:沿指定軸返回最小值所在的索引
示例:
# 3說明:最小值為 1,其索引位置為 3。
argwhere()
返回數組中滿足條件的元素坐標索引。
numpy.argwhere(a)參數說明:
? a:輸入數組(通常為布爾數組)
示例:
# [4]]argwhere() 為了統一表示不同維度的索引,始終返回形狀為 (N, ndim) 數組。其中:
? N:滿足條件的元素數量
? ndim:原數組的維度數
也就是說,每一行表示一個元素的位置坐標。
nonzero()
返回數組中非零元素的索引位置。
numpy.nonzero(a)參數說明:
? a:輸入數組
示例 1:一維數組
# (array([1, 3, 4]),)說明:數組中非零元素位于索引位置 1、3、4。
示例 2:二維數組
# (array([0, 1, 1]), array([1, 0, 2]))返回結果表示非零元素的行索引與列索引:
(1,2) 對應元素 3該函數常用于獲取數組中非零元素的位置,也常作為條件索引的基礎工具使用。
NumPy 還提供了 flatnonzero(),用于返回數組中非零元素在扁平數組中的索引位置。等價于:
np.nonzero(a.ravel())[0]但 flatnonzero() 寫法更加簡潔。
二、條件索引
where()
根據條件返回滿足條件的元素索引,或在兩個數組之間進行條件選擇。
numpy.where(condition, x=None, y=None)參數說明:
? condition:條件表達式
? x:條件為 True 時返回的值
? y:條件為 False 時返回的值
示例 1:返回索引
# (array([1, 3]),)說明:返回滿足條件元素的索引位置(元組)。
示例 2:條件選擇
# [0 1 0 1]where() 是 NumPy 中最常用的條件索引函數之一。
三、元素提取與選擇
take()
根據指定索引提取數組元素。
numpy.take(a, indices, axis=None)參數說明:
? a:輸入數組
? indices:索引序列
? axis:指定軸
示例:
# [10 30]take() 相當于使用索引列表提取元素。
choose()
根據索引數組從多個數組中選擇元素。
numpy.choose(a, choices)參數說明:
? a:索引數組
? choices:可供選擇的數組序列
示例:
# [10 2 30 4]index 中的每個值表示在對應位置應從哪個候選數組中取值,并返回該數組在同一位置的元素。其行為相當于:
result[i] = choices[index[i]][i]比如:
? 當索引為 0 時,從第 0 個候選數組 x 中取相同位置的元素
? 當索引為 1 時,從第 1 個候選數組 y 中取相同位置的元素
因此結果為:
[10, 2, 30, 4]該函數適用于按位置從多個候選數組中進行選擇。
take_along_axis()
沿指定軸,根據給定索引提取元素。
numpy.take_along_axis(arr, indices, axis)參數說明:
? arr:輸入數組
? indices:索引數組
? axis:沿哪個軸提取元素
示例:
# [60]]該函數會按照 idx 中給出的索引,在 axis=1 的方向上逐行提取元素:
? 第一行索引為 1,取出 30
? 第二行索引為 0,取出 60
因此結果為:
[60]]take_along_axis() 常與 argmax()、argmin()、argsort() 等函數配合使用,用于根據已計算出的索引位置提取對應元素。
compress()
根據布爾條件提取數組元素。
numpy.compress(condition, a, axis=None)參數說明:
? condition:布爾數組
? a:輸入數組
? axis:指定軸
示例:
# [10 30]說明:當 axis=None 時,數組會先被展平成一維數組再進行篩選。
extract()
根據條件返回數組中滿足條件的元素。
numpy.extract(condition, a)參數說明:
? condition:條件數組
? a:輸入數組
示例:
# [5 8]返回滿足條件的元素,并以一維數組形式返回。
ix_()
構造用于多維數組索引的網格索引結構。該函數常用于從數組中提取子矩陣或子塊(subarray)。
numpy.ix_(*args)參數說明:
? args:多個一維整數數組
返回值:
返回一組可用于數組索引的數組對象,用于構造多維索引的笛卡爾組合(Cartesian product)。
示例:
A[np.ix_(rows, cols)]輸出:
[ 9 11]]cols = [1,3]np.ix_() 會構造可廣播的索引結構,從而生成所有組合:
(2,1) (2,3)因此得到對應子矩陣:
[ 9 11]]當需要從數組中提取多行多列構成的子矩陣時,通常使用 np.ix_() 來構造索引。
四、索引變換與坐標轉換
unravel_index()
將一維索引轉換為多維坐標。
numpy.unravel_index(indices, shape)參數說明:
? indices:一維索引
? shape:數組形狀
示例:
# (1, 2)說明:默認使用 C-order(行優先順序)。
在形狀為 (2,3) 的數組中,一維索引 5 對應位置為 (1,2)。
ravel_multi_index()
將多維索引轉換為一維索引。
numpy.ravel_multi_index(multi_index, dims)參數說明:
? multi_index:多維索引
? dims:數組維度
示例:
# 5說明:將二維索引轉換為線性索引。
五、軸與維度操作
diagonal()
返回數組的對角線元素。
numpy.diagonal(a, offset=0, axis1=0, axis2=1)參數說明:
? a:輸入數組
? offset:對角線偏移
? axis1:第一個軸
? axis2:第二個軸
示例:
# [1 4]說明:返回矩陣主對角線元素。
trace()
計算數組主對角線元素之和。
numpy.trace(a, offset=0, axis1=0, axis2=1, dtype=None)參數說明:
? a:輸入數組。通常為二維數組(矩陣),但也可以是高維數組
? offset:對角線偏移量。默認值為 0
offset < 0:主對角線之下的對角線? axis1:用于確定對角線的第一個軸,默認值為 0
? axis2:用于確定對角線的第二個軸,默認值為 1
對于高維數組,trace() 會在 axis1 與 axis2 指定的兩個軸之間計算對角線,并對這些對角線元素求和。
? dtype:指定計算結果的數據類型。如果不指定,則使用數組元素的數據類型進行計算
示例 1:
# 5說明:相當于 1 + 4。
示例:偏移對角線
# 8說明:offset = 1 表示主對角線之上的一條對角線:2 + 6 = 8。
小結
NumPy 提供了一組用于數組索引與元素選擇的函數,可在多維數組中高效定位、篩選和提取數據。其中,argmax()、argmin()、argwhere() 與 nonzero() 用于獲取元素的位置索引;where() 用于條件篩選與元素選擇;take()、choose()、take_along_axis()、compress() 與 extract() 用于根據索引或條件提取數組元素;unravel_index() 與 ravel_multi_index() 用于在線性索引與多維坐標之間進行轉換;diagonal() 與 trace() 則用于訪問與計算數組的對角線元素。這些函數共同構成了 NumPy 數組數據訪問與選擇的重要工具。
“點贊有美意,贊賞是鼓勵”
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.