Numpy怎么使用最高效,5個技巧送給你!
在 reshape 函數(shù)中使用參數(shù)-1
Numpy 允許我們根據(jù)給定的新形狀重塑矩陣,新形狀應(yīng)該和原形狀兼容。有意思的是,我們可以將新形狀中的一個參數(shù)賦值為-1。這僅僅表明它是一個未知的維度,我們希望 Numpy 來算出這個未知的維度應(yīng)該是多少:Numpy 將通過查看數(shù)組的長度和剩余維度來確保它滿足上述標準。讓我們來看以下例子:
維度為-1 的不同 reshape 操作圖示。
- a = np.array([[1, 2, 3, 4],
- [5, 6, 7, 8]])
- a.shape
- (2, 4)
假設(shè)我們給定行參數(shù)為 1,列參數(shù)為-1,那么 Numpy 將計算出 reshape 后的列數(shù)為 8。
- a.reshape(1,-1)
- array([[1, 2, 3, 4, 5, 6, 7, 8]])
假設(shè)我們給定行參數(shù)為-1,列參數(shù)為 1,那么 Numpy 將計算出 reshape 后的行數(shù)為 8。
- a.reshape(-1,1)
- array([[1],
- [2],
- [3],
- [4],
- [5],
- [6],
- [7],
- [8]])
下面的代碼也是一樣的道理。
- a.reshape(-1,4)
- array([[1, 2, 3, 4],
- [5, 6, 7, 8]])a.reshape(-1,2)
- array([[1, 2],
- [3, 4],
- [5, 6],
- [7, 8]])a.reshape(2,-1)
- array([[1, 2, 3, 4],
- [5, 6, 7, 8]])a.reshape(4,-1)
- array([[1, 2],
- [3, 4],
- [5, 6],
- [7, 8]])
這也適用于任何更高維度張量的 reshape,但是只有一個維度的參數(shù)能賦值為-1。
- a.reshape(2,2,-1)
- array([[[1, 2],
- [3, 4]],
- [[5, 6],
- [7, 8]]])a.reshape(2,-1,1)
- array([[[1],
- [2],
- [3],
- [4]],
- [[5],
- [6],
- [7],
- [8]]])
如果我們嘗試 reshape 不兼容的形狀或者是給定的未知維度參數(shù)多于 1 個,那么將會報錯。
- a.reshape(-1,-1)
- ValueError: can only specify one unknown dimensiona.reshape(3,-1)
- ValueError: cannot reshape array of size 8 into shape (3,newaxis)
總而言之,當試圖對一個張量進行 reshape 操作時,新的形狀必須包含與舊的形狀相同數(shù)量的元素,這意味著兩個形狀的維度乘積必須相等。當使用 -1 參數(shù)時,與-1 相對應(yīng)的維數(shù)將是原始數(shù)組的維數(shù)除以新形狀中已給出維數(shù)的乘積,以便維持相同數(shù)量的元素。
Argpartition:在數(shù)組中找到最大的 N 個元素。
Numpy 的 argpartion 函數(shù)可以高效地找到 N 個最大值的索引并返回 N 個值。在給出索引后,我們可以根據(jù)需要進行值排序。
- array = np.array([10, 7, 4, 3, 2, 2, 5, 9, 0, 4, 6, 0])index = np.argpartition*(array, -5)[-5:]
- index
- array([ 6, 1, 10, 7, 0], dtype=int64)np.sort(array[index])
- array([ 5, 6, 7, 9, 10])
Clip:如何使數(shù)組中的值保持在一定區(qū)間內(nèi)
在很多數(shù)據(jù)處理和算法中(比如強化學(xué)習中的 PPO),我們需要使得所有的值保持在一個上下限區(qū)間內(nèi)。Numpy 內(nèi)置的 Clip 函數(shù)可以解決這個問題。Numpy clip () 函數(shù)用于對數(shù)組中的值進行限制。給定一個區(qū)間范圍,區(qū)間范圍外的值將被截斷到區(qū)間的邊界上。例如,如果指定的區(qū)間是 [-1,1],小于-1 的值將變?yōu)?1,而大于 1 的值將變?yōu)?1。
Clip 示例:限制數(shù)組中的最小值為 2,最大值為 6。
- #Example-1
- array = np.array([10, 7, 4, 3, 2, 2, 5, 9, 0, 4, 6, 0])
- print (np.clip(array,2,6))[6 6 4 3 2 2 5 6 2 4 6 2]#Example-2
- array = np.array([10, -1, 4, -3, 2, 2, 5, 9, 0, 4, 6, 0])
- print (np.clip(array,2,5))[5 2 4 2 2 2 5 5 2 4 5 2]
Extract:從數(shù)組中提取符合條件的元素
我們可以使用 Numpy extract () 函數(shù)從數(shù)組中提取符合條件的特定元素。
- arr = np.arange(10)
- arrarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])# Define the codition, here we take MOD 3 if zero
- condition = np.mod(arr, 3)==0
- conditionarray([ True, False, False, True, False, False, True, False, False,True])np.extract(condition, arr)
- array([0, 3, 6, 9])
同樣地,如果有需要,我們可以用 AND 和 OR 組合的直接條件,如下所示:
- np.extract(((arr > 2) & (arr < 8)), arr)array([3, 4, 5, 6, 7])
setdiff1d:如何找到僅在 A 數(shù)組中有而 B 數(shù)組沒有的元素
返回數(shù)組中不在另一個數(shù)組中的獨有元素。這等價于兩個數(shù)組元素集合的差集。
- a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
- b = np.array([3,4,7,6,7,8,11,12,14])
- c = np.setdiff1d(a,b)
- carray([1, 2, 5, 9])
小結(jié)
以上 5 個 Numpy 函數(shù)并不經(jīng)常被社區(qū)使用,但是它們非常簡潔和優(yōu)雅。在我看來,我們應(yīng)該盡可能在出現(xiàn)類似情況時使用這些函數(shù),不僅因為代碼量更少,更因為它們是解決復(fù)雜問題的絕妙方法。