Numpy 怎麼使用最高效,5 個技巧送給你!
選自 TowardsDataScience,作者:Baijayanta Roy
機器之心編譯
本文作者將分享 5 個優雅的 Python Numpy 函數,有助於高效、簡潔的數據處理。
在 reshape 函數中使用參數 - 1
Numpy 允許我們根據給定的新形狀重塑矩陣,新形狀應該和原形狀兼容。有意思的是,我們可以將新形狀中的一個參數賦值爲 - 1。這僅僅表明它是一個未知的維度,我們希望 Numpy 來算出這個未知的維度應該是多少:Numpy 將通過查看數組的長度和剩餘維度來確保它滿足上述標準。讓我們來看以下例子:
維度爲 - 1 的不同 reshape 操作圖示。
假設我們給定行參數爲 1,列參數爲 - 1,那麼 Numpy 將計算出 reshape 後的列數爲 8。
假設我們給定行參數爲 - 1,列參數爲 1,那麼 Numpy 將計算出 reshape 後的行數爲 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,但是隻有一個維度的參數能賦值爲 - 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 不兼容的形狀或者是給定的未知維度參數多於 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 操作時,新的形狀必須包含與舊的形狀相同數量的元素,這意味着兩個形狀的維度乘積必須相等。當使用 -1 參數時,與 - 1 相對應的維數將是原始數組的維數除以新形狀中已給出維數的乘積,以便維持相同數量的元素。
**Argpartition:**在數組中找到最大的 N 個元素。
Numpy 的 argpartion 函數可以高效地找到 N 個最大值的索引並返回 N 個值。在給出索引後,我們可以根據需要進行值排序。
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:**如何使數組中的值保持在一定區間內
在很多數據處理和算法中(比如強化學習中的 PPO),我們需要使得所有的值保持在一個上下限區間內。Numpy 內置的 Clip 函數可以解決這個問題。Numpy clip () 函數用於對數組中的值進行限制。給定一個區間範圍,區間範圍外的值將被截斷到區間的邊界上。例如,如果指定的區間是 [-1,1],小於 - 1 的值將變爲 - 1,而大於 1 的值將變爲 1。
Clip 示例:限制數組中的最小值爲 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:**從數組中提取符合條件的元素
我們可以使用 Numpy extract () 函數從數組中提取符合條件的特定元素。
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 數組中有而 B 數組沒有的元素
返回數組中不在另一個數組中的獨有元素。這等價於兩個數組元素集合的差集。
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])
小結
以上 5 個 Numpy 函數並不經常被社區使用,但是它們非常簡潔和優雅。在我看來,我們應該儘可能在出現類似情況時使用這些函數,不僅因爲代碼量更少,更因爲它們是解決複雜問題的絕妙方法。
後臺回覆『numpy』即可下載 numpy 入門書籍《NumPy Beginners Guide Third Edition.pdf》(英文版)
_原文鏈接:_https://towardsdatascience.com/5-smart-python-numpy-functions-dfd1072d2cb4
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/CRgFIBsQzsgU7DqJiCcIYw