給妹子講python-S02E03ndarray的基本運算
python,不管你懂沒懂,反正妹子是搞懂了
轉載請註明:知乎專欄《給妹子講python》--醬油哥
【要點搶先看】
1.二維數組的轉置與內積2.數組的元素級別運算3.條件邏輯運算where4.各軸向上的統計運算5.布爾數組的運算6.數組的就地排序
這一集我們主要介紹NumPy中,關於ndarray數組的基本運算。
二維數組的轉置,這裡先簡單的提一下,這其實是線性代數的內容,我們後面介紹線性代數的內容時還會再提的。
import numpy as np arr = np.arange(15).reshape(5,3) print(arr) print(arr.T) [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11] [12 13 14]] [[ 0 3 6 9 12] [ 1 4 7 10 13] [ 2 5 8 11 14]]
順便提一句,線性代數裡面另一個最基本的運算,計算矩陣的內積
import numpy as np arr = np.arange(6).reshape(3,2) print(arr) print(arr.T) print(np.dot(arr.T,arr)) [[0 1] [2 3] [4 5]] [[0 2 4] [1 3 5]] [[20 26] [26 35]]
針對數組元素的元素級別的運算,就是輻射到每個元素,並進行相同的計算過程
import numpy as np arr1 = np.array([1,3,5,4,5]) arr2 = np.array([4,6,1,3,4]) print(np.sqrt(arr1)) print(np.square(arr2)) print(np.multiply(arr1,arr2)) print(np.subtract(arr1,arr2)) [ 1. 1.73205081 2.23606798 2. 2.23606798] [16 36 1 9 16] [ 4 18 5 12 20] [-3 -3 4 1 1]
這裡只是舉了幾個例子,事實上,對於一元運算,可以求一個數組內每個元素的平方、開方、絕對值、指數 等等,所有的運算都可以滿足,而二元運算,主要是滿足兩個向量之間的加減乘除、取最值、比較運算等等
條件邏輯的數組運算:np.where
這個其實功能上類似於python內置列表中的列表解析式,但是其表述更為簡潔,在大數據運算方面更快(因為列表解析式的底層是純python),從例子中可以看出,賦值既可以是標量,也可以是數組形式
import numpy as np arr = np.random.randn(4,4) print(arr) print(np.where(arr>0,2,-2)) print(np.where(arr>0,2,arr)) [[ 0.19699344 -0.6502777 -1.03611804 -0.43403437] [-1.95661572 0.44830588 -0.98746604 -0.57244612] [ 0.44935834 -0.67782579 -0.49945472 -0.46147115] [-0.26284806 -0.4260144 0.43380332 -0.04461859]] [[ 2 -2 -2 -2] [-2 2 -2 -2] [ 2 -2 -2 -2] [-2 -2 2 -2]] [[ 2. -0.6502777 -1.03611804 -0.43403437] [-1.95661572 2. -0.98746604 -0.57244612] [ 2. -0.67782579 -0.49945472 -0.46147115] [-0.26284806 -0.4260144 2. -0.04461859]]
再來說說高維數組各軸向上的統計運算
對一個數組內的值進行求和、均值、方差、標準差、累積、累和以及最值求解,這個也是非常常用的。
在求均值時,如果不指定參數,則是求取全部值的平均值,如果指定關鍵字參數axis=0,則是沿著縱向求均值,axis=1,沿著橫向求均值:
import numpy as np arr = np.array([[0,1,2],[3,4,5],[6,7,8]]) print(arr.mean()) print(arr.mean(axis=0)) print(arr.mean(axis=1)) 4.0 [ 3. 4. 5.] [ 1. 4. 7.]
求和運算也是同理
import numpy as np arr = np.array([[0,1,2],[3,4,5],[6,7,8]]) print(arr.sum()) print(arr.sum(axis=0)) print(arr.sum(axis=1)) 36 [ 9 12 15] [ 3 12 21]
類似的還有求取標準差std和方差var,最值min/max,和最值索引argmin/argmax
特別說一下,累和、累積只能得到中間向量結果,無法得到所有值計算出的一個數值解
import numpy as np arr = np.array([[0,1,2],[3,4,5],[6,7,8]]) print(arr.cumsum(axis=0)) print(arr.cumprod(axis=1)) [[ 0 1 2] [ 3 5 7] [ 9 12 15]] [[ 0 0 0] [ 3 12 60] [ 6 42 336]]
繼續看看布爾型數組的運算方法
先看一下布爾數組的求和
import numpy as nparr = np.random.randn(10)print(arr)print((arr>0).sum()) [-1.81692025 -0.04830079 -1.52511841 0.40788744 -0.17000841 0.16426966 0.13271131 1.21298754 0.9206151 -1.00320183]5
再看看布爾數組的與、或運算
import numpy as np bools = np.array([False,False,True,False]) print(bools.any()) print(bools.all()) True False
最後我們來看看數組的就地排序
這個和python內置列表類型一樣,可以通過sort方法就地排序
import numpy as np arr = np.random.randn(5) print(arr) arr.sort() print(arr) [ 0.31665043 1.76497754 0.19695847 0.3717157 1.16233139] [ 0.19695847 0.31665043 0.3717157 1.16233139 1.76497754]
多維數組沿著某一個軸向進行排序
import numpy as np arr = np.random.randn(5,3) print(arr) arr.sort(axis=1) print(arr) [[ 0.21721306 0.57932052 -1.86266246] [-0.16954323 0.53703463 -0.82359951] [-2.08265881 0.22894332 -1.71529687] [ 0.10172732 0.89584416 1.14315116] [ 0.7074438 -1.11062283 0.57065222]] [[-1.86266246 0.21721306 0.57932052] [-0.82359951 -0.16954323 0.53703463] [-2.08265881 -1.71529687 0.22894332] [ 0.10172732 0.89584416 1.14315116] [-1.11062283 0.57065222 0.7074438 ]]
需要注意的是,如果調用頂層方法np.sort則會返回一個排好序的副本,並不會在本地對數組進行排序修改。
利用本地排序可以比較容易的獲取指定的百分位數。
推薦閱讀:
※為什麼python缺少一個msbuild,從2008年到2014年一直不加上?
※Python數據分析及可視化實例之抽取文本主題(30)
※Python基本語法的學習
※Python有沒有一個類似RStudio一樣的IDE?