數組的四則運算
在numpy模塊中,實現四則運算的計算既可以使用運算符號,也可以使用函數,具體如下例所示:
#加法運算
import numpy as np
math = np.array([98,83,86,92,67,82])
english = np.array([68,74,66,82,75,89])
chinese = np.array([92,83,76,85,87,77])
tot_symbol = math+english+chinese
tot_fun = np.add(np.add(math,english),chinese) #add 加法
print('符號加法:\n',tot_symbol)
print('函數加法:\n',tot_fun)
#除法
height = np.array([165,177,158,169,173])
weight = np.array([62,73,59,72,80])
BMI_symbol = weight/(height/100)**2
BMI_fun = np.divide(weight,np.divide(height,100)**2) #divide 除法
print('符號除法:\n',BMI_symbol)
print('函數除法:\n',BMI_fun)
out:
符號加法: [258 240 228 259 229 248] 函數加法: [258 240 228 259 229 248] 符號除法: [22.77318641 23.30109483 23.63403301 25.20920136 26.7299275 ] 函數除法: [22.77318641 23.30109483 23.63403301 25.20920136 26.7299275 ]
四則運算中的符號分別是“+-*/”,對應的numpy模塊函數分別是np.add np.subtract,np.multiply,np.divide.需要注意的是,函數只能接受兩個對象的運算,如果需要多個對象的運算,就得使用嵌套方法。如上所示的符號假發和符號的除法。不管是符號方法還是函數方法,都必須保證操作的數組具有相同的形狀,除了數組與標量之間的運算(如除法中的身高與100的商)。另外,還有三個數學運算符,分別是余數,整數和指數:
import numpy as np
arr7 = np.array([[1,2,10],[10,8,3],[7,6,5]])
arr8 = np.array([[2,2,2],[3,3,4],[4,4,4]])
print('數組arr7:\n',arr7)
print('數組arr8:\n',arr8)
print('求余計算:\n',arr7 % arr8)
print('整除:\n',arr7 // arr8) #這里面要注意的就是 整除的時候 是 “//”而不是 "/"
print('計算指數:\n',arr7 ** arr8)
out:
數組arr7: [[ 1 2 10] [10 8 3] [ 7 6 5]] 數組arr8: [[2 2 2] [3 3 4] [4 4 4]] 求余計算: [[1 0 0] [1 2 3] [3 2 1]] 整除: [[0 1 5] [3 2 0] [1 1 1]] 計算指數: [[ 1 4 100] [1000 512 81] [2401 1296 625]]
另外還可以使用np.fmod,np.modf和np.power,但是整除的函數應用會稍微復雜一點,需要寫成np.modf(arr7/arr8)[1],因為modf可以返回
數值的小數部分和整數部分,而整數部分就是要取的整除值。
比較運算
處理數組的元素之間可以實現上面提到的數學運算,還可以做元素的比較運算。關於比較運算符如下:
符號 | 函數 | 含義 |
> | np.greater(arr1,arr2) | 判斷arr1的元素是否大於arr2的元素 |
>= | np.greater_equal(arr1,arr2) | 判斷arr1的元素是否大於等於arr2的元素 |
< | np.less(arr1,arr2) | 判斷arr1的元素是否小於arr2的元素 |
<= | np.less_equal(arr1,arr2) | 判斷arr1的元素是否小於等於arr2的元素 |
== | np.equal(arr1,arr2) | 判斷arr1的元素是否等於arr2的元素 |
!= | np.not_equal(arr1,arr2) | 判斷arr1的元素是否小等於arr2的元素 |
運用比較運算符可以返回bool類型的值,即True和False。有兩種情況會普遍使用到比較運算符,一個是從數組中查詢滿足條件的元素,另一個是根據判斷的結果執行不同的操作。例如:
import numpy as np
arr7 = np.array([[1,2,10],[10,8,3],[7,6,5]])
arr8 = np.array([[2,2,2],[3,3,2],[4,4,4]])
print(arr7)
print('從arr7中取出所有大於arr8的元素',arr7[arr7>arr8]) #取出的是所有arr7中對應的元素大於arr8中對應位置的元素
arr9 = np.array([3,10,23,7,15,9,17,22,4,8,16])
print('取出arr9中所有大於10的元素',arr9[arr9>10]) #得到的是一個一維數組 相當於每個數組中的元素都會跟10來進行比較
print(np.greater(arr7,arr8)) #輸出的是原數組結構的布爾型元素的數組
out:
[[ 1 2 10] [10 8 3] [ 7 6 5]] 從arr7中取出所有大於arr8的元素 [10 10 8 3 7 6 5] 取出arr9中所有大於10的元素 [23 15 17 22 16] [[False False True] [ True True True] [ True True True]]
廣播運算
上面介紹的是相同形狀的數組,當數組形狀不同時,也能夠進行數學運算的功能成為數組的廣播。數組的廣播是有規則的,如果不滿足這些規則就會出錯;規則如下:
a.各輸入數組的維度可以不相等,但必須確保從右到左維度值相等。
b.如果對應維度值不相等,就必須保證其中一個為1.
c.各輸入數組都向其shape最長的數組看齊,shape中不足的部分都通過在前面加1補齊
下面通過實例來加強理解
import numpy as np
arr10 = np.arange(12).reshape(3,4) #arange(12)表示生成從0-11總共12個數組元素組成的數組,然后通過reshape編 #成3行4列的二維數組
arr11 = np.arange(101,113).reshape(3,4) #同上面arange(101,113)就是生成從 101到112的元素的數組
print('3x4的二維矩陣運算:\n',arr10 + arr11)
arr12 = np.arange(60).reshape(5,4,3) #這是個三維數組,我們可以理解為一個長5寬為4高為3的魔方
arr10 = np.arange(12).reshape(4,3) #4行3列的二維數組
print('維數不一致,但末尾的維度值一致:\n',arr12 + arr10) #我們可以這么看,reshape(5,4,3)其實里面相當於包含了 5個 #reshape(4,3)的二維數組,末尾兩個維度相同,可以進行運算
arr12 = np.arange(60).reshape(5,4,3)
arr13 = np.arange(4).reshape(4,1) #這個里面末尾的維度雖然一個是‘’4,3‘’,一個是“4,1”因為后面的數組末尾維度 #中其中一個是‘’1‘’,所以是可以進行運算的
print('維數不一致,維數值也不一致,但維度值至少一個為1:\n',arr12+arr13) #就是在5個(4行3列)的數組中,每行的各個元素對 #應加0,1,2,3
arr14 = np.array([5,15,25])
print('arr14的維度自動補齊為(1,3): \n',arr10 + arr14) #每行對應位置元素分別加上 5,15,25
out:
3x4的二維矩陣運算: [[101 103 105 107] [109 111 113 115] [117 119 121 123]] 維數不一致,但末尾的維度值一致: [[[ 0 2 4] [ 6 8 10] [12 14 16] [18 20 22]] [[12 14 16] [18 20 22] [24 26 28] [30 32 34]] [[24 26 28] [30 32 34] [36 38 40] [42 44 46]] [[36 38 40] [42 44 46] [48 50 52] [54 56 58]] [[48 50 52] [54 56 58] [60 62 64] [66 68 70]]] 維數不一致,維數值也不一致,但維度值至少一個為1: [[[ 0 1 2] [ 4 5 6] [ 8 9 10] [12 13 14]] [[12 13 14] [16 17 18] [20 21 22] [24 25 26]] [[24 25 26] [28 29 30] [32 33 34] [36 37 38]] [[36 37 38] [40 41 42] [44 45 46] [48 49 50]] [[48 49 50] [52 53 54] [56 57 58] [60 61 62]]] arr14的維度自動補齊為(1,3): [[ 5 16 27] [ 8 19 30] [11 22 33] [14 25 36]]
以上的操作,根據備注去理解,平時多維數組方面的應用比較少,能理解這些規則是怎么來的就可以了,需要用到的時候再深究。