# 資料D4~5:NumPy 陣列的算術/邏輯比較運算 ## 陣列算術運算 https://numpy.org/devdocs/user/absolute_beginners.html#basic-array-operations 加法 + 或np.add(x,y) 減法 - 或np.subtract(x,y) 乘法 * 或np.multiple(x,y) 除法 / 或np.divide(x,y) 次方 ** 或np.power(x,y) 平方根 np.sqrt(x) 常用對數的底 np.e 常用對數的底的a次方 np.exp(a) (裡面可放一個陣列如np.exp(np.arange(a))) 對數 np.log(x) e為底 np.log2(x) 2為底 np.log10(x) 10為底,其他底則用換底公式 np.log1p(x) e為底計算log(1+x) 近似 ![](https://i.imgur.com/qZrofC0.png) np.abs(a) 取絕對值 np.fabs(a) 取絕對值但不能用在虛數 ## 廣播特性 shape一樣的話,一般運算直接逐元運算 否則的話可遵循廣播模式 Array + 常數:將常數補成跟array尺寸一樣的常數array 若是兩個Array尺寸不同:在可判斷的情況下,例如後者只有某方向array,則會繼續疊成前者尺寸的array ``` a = np.array( [20,30,40,50] ) print(a + 1) # array([21 31 41 51]) ``` python無此特性,需要跑回圈 ``` a = [20, 30, 40, 50] b = [] for i in a: b.append(i+1) print(b) # [21, 31, 41, 51] ``` ![](https://i.imgur.com/7jJjsk0.png) https://zhuanlan.zhihu.com/p/35010592 ## 陣列矩陣運算 a.transpose() 轉置 np.linalg.inv(a) 反矩陣 np.trace(u) 求trace np.linalg.solve(a, y) 解ax=y的x 其餘運算,通常收錄在np.linalg中 https://www.itread01.com/content/1542914343.html ## 陣列的邏輯比較運算 比較 陣列的元素的比較,由對齊或廣播原則運算,輸出為布林陣列  > < == != np.equal(a,b) np.notequal(a,b) np.greater(a,b) np.greater_equal(a,b) np.less(a,b) np.less_equal(a,b) 陣列的比較 np.array_equal(a,b) 形狀內容完全相同則True np.array_equiv(a,b) 形狀相同或形狀不一樣但廣播之後相同則True 邏輯 交集 & 聯集 | (numpy裡面沒有直接or and) np.logical_and(a,b) 交集 np.logical_or(a,b) 聯集 np.logical_not(a,b) 補集 np.logical_xor(a,b) ### 布林遮罩 https://www.w3schools.com/python/numpy_array_filter.asp a為陣列 a[布林值的陣列] 可挑出a裡面True對應的位置的元素 ``` a = np.array( [10, 20, 30, 40] ) print(a[ [True, True, True, True] ]) # [10 20 30 40] print(a[ [True, False, True, False] ]) # [10 30] ``` 遮罩也可以用邏輯或比較運算得到 例如 a[a>20] 以下可將某些條件的元素作運算 a[(a>2) & (a<7)] = a[(a>2) & (a<7)] *(-1) ### any/all np.any(a) 若a有True則輸出True np.all(a) 全部都是True才會輸出True 若是數字,0表示False,其他nan或無限為True 也可以依照軸比較 np.any([[True, False], [False, False]], axis=0) 則會得到[True, False] ### 無限以及無 np.nan 指not a number np.inf 正無限大 np.PINF 正無限大 np.NINF 負無限大 以下是每個元素判斷,得到一個布林陣列 np.isnan(a) 判斷是否為nan np.isfinite(a) 判斷是否為有限數 np.isinf(a) np.ispinf(a) np.isninf(a) 判斷是否為無限大/正/負無限大 np.isnat(a) 判斷是否為 非日期時間 ### 向量/數字判斷 np.isreal(a) np.iscomplex(a) 判斷"元素"是否為實數/複數 np.isreal(a) np.iscomplex(a) 判斷"物件"是否為實數/複數 np.isscalar(a) 判斷"物件"是否為純量 ###### tags: `資料科學馬拉松` `python`