# 資料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)
近似

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://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`