在數據分析、科學計算以及機器學習中,除了讀取和提取數組元素之外,還經常需要修改數組中的數據。
NumPy 提供了一組與數組數據寫入、條件替換、整體填充以及結構調整相關的函數。這些函數能夠在數組層面完成批量操作,從而避免 Python 循環帶來的性能損失。
按照功能劃分,NumPy 中與數組元素修改相關的常用函數通常可以分為以下幾類:
(1)寫入與替換
(2)插入元素
(3)刪除元素
(4)數組填充
一、寫入與替換
put()
根據指定索引向數組中寫入元素。
numpy.put(a, ind, v, mode='raise')參數說明:
? a:輸入數組(將被原地修改)
? ind:索引位置
? v:要寫入的值
? mode:索引越界處理方式
clip:截斷到邊界示例 1:
# [10 99 30 88]說明:索引位置 1 和 3 的元素被替換為 99 和 88。
需要注意的是,put() 始終基于數組的 C-order 扁平索引(row-major flattened index)進行定位,而不考慮原數組的多維結構。
示例 2:
print(A)輸出:
[99 4]]二維數組在內部按一維順序 [1,2,3,4],故索引 2 對應元素 3。
示例 3:
# [20 1 30 3]說明:當 ind 中出現重復位置時,后寫入的值會覆蓋前寫入的值。
put_along_axis()
沿指定軸根據索引寫入元素。
numpy.put_along_axis(arr, indices, values, axis)參數說明:
? arr:輸入數組
? indices:索引數組
? values:要寫入的值
? axis:指定軸
示例:
print(A)輸出:
[88 50 60]]第 0 行索引為 1,因此將 20 替換為 99;第 1 行索引為 0,因此將 40 替換為 88。
indices 的形狀應與 arr 在除 axis 外的各維相兼容,其作用是在指定軸上為每個位置提供寫入下標。
put_along_axis() 常與 argmax()、argsort() 等函數配合使用。
place()
根據條件替換數組中的元素。
numpy.place(arr, mask, vals)參數說明:
? arr:輸入數組
? mask:布爾條件數組
? vals:替換值
示例:
print(a)輸出:
[ 1 2 3 99 88]滿足條件 a > 3 的元素被替換為指定值。
如果 vals 數量不足,NumPy 會循環使用這些值。
place() 會按一維遍歷順序將 vals 中的值依次填入 mask 為 True 的位置;若 vals 不足,則循環使用。
putmask()
根據條件掩碼替換數組中的元素。
numpy.putmask(arr, mask, values)參數說明:
? arr:輸入數組(將被原地修改)
? mask:布爾條件數組
? values:替換值
該函數會將 mask 為 True 的位置替換為指定值。
示例 1:
print(a)輸出:
[1 2 3 0 0]滿足條件 a > 3 的元素被替換為 0。
示例 2:二維數組
print(A)輸出:
[-1 -1 -1]]條件 A > 3 的位置全部被替換為 -1。
putmask() 更強調“按掩碼位置寫入”,其 values 會按廣播或重復規則作用到滿足條件的位置。
需要注意的是 putmask() 會直接修改原數組,而不是返回新數組。
如果希望返回新數組而不直接修改原數組,也可以使用 where()。它會根據條件在兩個候選值之間進行選擇,并生成新的結果數組。
示例:
print(B)輸出:
[-1 -1 -1]]copyto()
將一個數組的數據復制到另一個數組中。
numpy.copyto(dst, src, casting='same_kind', where=True)參數說明:
? dst:目標數組
? src:源數組
? where:條件掩碼
? casting:類型轉換規則
示例:
print(a)輸出:
[ 1 2 30 40]只有滿足條件 b > 20 的元素才會被復制到數組 a 中。
copyto() 常用于實現帶條件的批量賦值。它支持顯式控制類型轉換規則(如 casting),并按 NumPy 的廣播規則將源數據復制到目標數組中。
ufunc.at()(以 np.add.at() 為例)
對指定索引位置執行原地運算,尤其適用于處理重復索引時的累積寫入。
常見用法:
numpy.add.at(a, indices, b)參數說明:
? a:目標數組(將被原地修改)
? indices:索引位置
? b:參與運算的值
示例:
# [2 0 1]索引位置 0 出現兩次,因此對應元素被累加兩次;索引位置 2 出現一次,因此該位置加 1。
對比普通寫法:
# [1 0 1]普通高級索引賦值在遇到重復索引時,結果通常不是逐次累積;而 np.add.at() 會逐次作用到每個索引位置,因此更適合統計、累計等場景。
補充說明:
at() 是通用函數(ufunc)的方法,而不是獨立模塊函數。
常見形式有:
np.minimum.at()它主要用于需要“原地、逐次、可處理重復索引”的更新場景。
二、插入元素
insert()
在數組指定位置插入元素。
numpy.insert(arr, obj, values, axis=None)參數說明:
? arr:輸入數組
? obj:插入位置
? values:插入的值
? axis:指定軸
示例 1:
np.insert(a, 2, 99)輸出:
[ 1 2 99 3 4]說明:在索引位置 2 插入元素 99。
示例 2:二維數組(指定軸)
np.insert(A, 1, [9, 9, 9], axis=0)輸出:
[4 5 6]]在 axis=0(行方向)的索引 1 處插入新行 [9,9,9]。
需要注意的是,insert() 不會修改原數組,而是返回新的數組。
三、刪除元素
delete()
刪除數組中指定位置的元素。
numpy.delete(arr, obj, axis=None)參數說明:
? arr:輸入數組
? obj:刪除位置
? axis:指定軸
示例 1:
np.delete(a, 1)輸出:
[10 30 40]刪除索引位置 1 的元素。
示例 2:二維數組(指定軸)
np.delete(A, 1, axis=1)輸出:
[4 6]]在 axis=1(列方向)刪除索引 1 的列。
delete() 會返回新的數組,而不會修改原數組。
提示:
需要注意的是,insert() 與 delete() 在內部會創建新數組并復制數據,因此在大規模數據處理中性能較低。若需要頻繁修改數組結構,通常建議先使用 Python 列表構建數據,再轉換為 NumPy 數組。
四、數組填充
fill()
用指定值填充整個數組。
ndarray.fill(value)參數說明:
? value:填充值
示例:
print(a)輸出:
[0 0 0 0]數組中的所有元素都會被替換為指定值。
提示:
fill() 是 ndarray 對象的方法,用于原地將數組所有元素填充為同一個值,而不是 numpy 模塊下的獨立函數。
小結
NumPy 提供了一組常用的數組修改函數,包括按索引寫入(put、put_along_axis)、按條件替換(place、putmask、copyto)、處理重復索引下的原地累積更新(如 np.add.at())、結構調整(insert、delete)以及整體填充(fill)。需要特別注意的是,不同函數在是否原地修改、是否返回新數組以及性能特征上存在顯著差異。在實際應用中,應根據數據規模與計算方式選擇合適的操作,以兼顧表達清晰性與執行效率。
“點贊有美意,贊賞是鼓勵”
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
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.