<jupyter_start><jupyter_text>Part.2-1-04 NumPy 陣列邏輯函式 (Logic Functions) 範例目標:
實做
1. 陣列內容 (Array contents)
2. 陣列型別偵測 (Array type testing)
3. 比較 (Comparison)
4. 邏輯操作 (Logical operations)
5. Truth 值測試 (Truth value testing)
 範例重點:
1. 在此介紹的函數應注意是否為 element-wise 的比較邏輯，因不同邏輯產生的輸出會不相同
2. np.inf表示無限數，np.nan表示Not a Number<jupyter_code>import numpy as np<jupyter_output><empty_output><jupyter_text>1. 陣列內容  1.1 `isnan()`呼叫 `isnan()` 函式判斷陣列元素是否為 nan，如果是的話回傳 True，否則回傳 False。`numpy.nan` 與 `numpy.NAN` 都是 NumPy 常數，代表 Not a Number，不過在官方文件中建議統一使用小寫的 `nan`。<jupyter_code>np.isnan(np.array([1.0, np.nan, 3.0]))<jupyter_output><empty_output><jupyter_text>1.2 `isfinite()`判斷陣列元素是否為有限數 (finite number)，如果是的話回傳 True，如果元素值為正無限數、負無限數、或是 nan 則回傳 False。<jupyter_code>np.isfinite(1.0)
np.isfinite(np.nan)<jupyter_output><empty_output><jupyter_text>1.3 `isinf()`、`isposinf()`、`isneginf()`判別元素是否為無限數。|函式|說明||---|---||isinf()|判斷陣列元素是否為正無限數或負無限數||isposinf()|判斷陣列元素是否為正無限數||isneginf()|判斷陣列元素是否為負無限數|在下列範例中我們會用到 NumPy 內建常數 (Constants) 來示範，無限數相關的常數如下表：|常數|說明|別名||---|---|---||np.inf|正無限數| np.Inf, np.Infinity, np.PINF, np.infty||np.Inf|正無限數|||np.Infinity|正無限數|||np.PINF|正無限數|||np.infty|正無限數|||np.NINF|負無限數||NumPy 文件建議正無限數使用 `np.inf` (小寫)。<jupyter_code>np.isinf([np.inf, -np.inf, 1.0, np.nan, np.PINF])
np.isposinf(np.PINF)
np.isneginf(np.NINF), np.isneginf(np.nan)<jupyter_output><empty_output><jupyter_text>1.4 `isnat()``isnat()` 的 nat (NaT) 是 not a time 的意思，用來判別陣列元素是否為日期時間。若非日期時間 (包括 datetime 或 timedelta) 的話回傳 True，若是的話則回傳 False。<jupyter_code>np.isnat(np.array(["NaT", "2020-06-26"], dtype="datetime64[ns]"))<jupyter_output><empty_output><jupyter_text>2. 陣列型別偵測  2.1 `isscalar()`如果陣列元素為純量或是數字物件 (例如實數、複數、有理數) 、內建常數、字串的話，`isscalar()` 回傳 True 。需要留意的是 `isscalar()` 不是 element-wise 的，所以傳入值須為元素。數字物件的詳細說明，參照 [PEP 3141](https://www.python.org/dev/peps/pep-3141/)。<jupyter_code>a = np.array([1, 2, 3])
np.isscalar(a[2])<jupyter_output><empty_output><jupyter_text>如果傳傳整個陣列的話，會回傳 False。<jupyter_code>np.isscalar(a)<jupyter_output><empty_output><jupyter_text>傳入內建常數 `np.pi`，回傳 True。<jupyter_code>np.isscalar(np.pi)<jupyter_output><empty_output><jupyter_text>傳入 0 維陣列的話，仍然會回傳 False。<jupyter_code>np.isscalar(np.array(3.0))<jupyter_output><empty_output><jupyter_text>2.2 `isreal()`、`iscomplex()`、`isrealobj()`、`iscomplexobj（）`判斷輸入的陣列元素為實數 (`isreal()`) 或是複數 (`iscomplex()`)。<jupyter_code># 包含實數與複數的陣列
b = np.array([1+1j, 1+0j, 4.5, 3, 2, 2j])
np.isreal(b)
np.iscomplex(b)<jupyter_output><empty_output><jupyter_text>與上面 2 個函式類似的 `isrealobj()`、`iscomplexobj（）`，不同之處在於是判斷整個陣列物件是否為實數或是複數物件。<jupyter_code>np.iscomplexobj(b)
# 陣列中有複數，所以回傳 False
np.isrealobj(b)
# 陣列中全部是實數
np.isrealobj(np.array([1, 2.0, 3.1]))<jupyter_output><empty_output><jupyter_text>3. 比較  3.1 比較 2 個陣列是否相同：`np.array_equal()`、`np.array_equiv()`|函式|說明||---|---||np.array_equal()|若兩個陣列形狀與元素值均相同，回傳 True||np.array_equiv()|兩個陣列形狀元素值均相同，回傳 True；如果兩個陣列維度不同的話，須符合廣播規則，且元素值均相同，則回傳 True|兩個函式不同之處在於 `array_equal()` 需要形狀完全一樣且元素值皆相同才為 True。<jupyter_code>np.array_equal(np.array([1, 2, 3]), np.array([1, 2, 3]))
np.array_equal(np.array([1, 2, 3]), np.array([1, 2, 5]))<jupyter_output><empty_output><jupyter_text>下列 3 個 `array_equiv()` 範例均回傳 True。<jupyter_code>np.array_equiv(np.array([1, 2, 3]), np.array([1, 2, 3]))
np.array_equiv(np.array([1, 2, 3]), np.array([[1, 2, 3], [1, 2, 3]]))
np.array_equiv(np.array([1, 1, 1]), np.array([1]))<jupyter_output><empty_output><jupyter_text>3.2 比較：等於/不等於、大於/大於或等於、小於/小於或等於|函式|說明||---|---||np.equal()|等於||np.not_equal()|不等於||np.greater()|大於||np.greater_equal()|大於或等於||np.less()|小於||np.less_equal()|小於或等於|上列的函式均可以比較兩個形狀相同的陣列，或是比較符合廣播規則的兩個陣列，若元素值相同的話就回傳 True。比較時均是 element-wise 的比較。<jupyter_code># 形狀與元素值均相同
np.equal(np.array([1, 2, 3]), np.array([1, 2, 3]))
# 符合廣播規則的相等
np.equal(np.array([1, 1, 1]), np.ones(1))
# 不等於的比較，符合廣播規則
np.not_equal([1, 2], [[1, 3],[1, 4]])<jupyter_output><empty_output><jupyter_text>4. 邏輯操作邏輯比較函式都是 element-wise，比較 2 個陣列元素。如果 2 個陣列的形狀不同的話，必須符合廣播 (broadcasting) 規則。|Logical operation|函式||---|---||AND|np.logical_and()||OR|np.logical_or()||NOT|np.logical_not()||XOR|np.logical_xor()|<jupyter_code>x = np.array([True, True, False, False])
y = np.array([True, False, True, False])
np.logical_and(x, y)
np.logical_or(x, y)
np.logical_not(x)
np.logical_xor(x, y)<jupyter_output><empty_output><jupyter_text>下面範例是透過廣播產生符合條件的 2 個 True/False 陣列，並且進行 logical AND 操作。<jupyter_code>a = np.arange(5)
a
np.logical_and(a > 1, a < 4)<jupyter_output><empty_output><jupyter_text>5. `np.all()`、`np.any()`針對軸 (axis) 進行比較，兩個函式不同的地方在於 `np.all()` 是 AND 邏輯的比較，而 `np.any()` 是 OR 邏輯的比較。以下的值均認定為非 0，也就是屬於 True：True、NaN、正無限值、負無限值<jupyter_code>np.all([-1, np.nan, 5])
np.all([-1, 4, 0])
np.any([[True, False], [True, True]])
np.any([[True, False], [False, False]], axis=0)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.20775389801938474, 'fraction_numerical': 0.029919932574799833, 'mean_word_length': 8.727459016393443, 'pattern_counts': {'":': 0, '<': 70, '<?xml version=': 0, '>': 70, 'https://': 1, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '17', 'dir': 'jupyter-structured-clean-dedup', 'id': '569003', 'license': 'MIT', 'n_tokens_mistral': 3028, 'n_tokens_neox': 3090, 'n_words': 285, 'path': 'Sample Code/Day_04_SampleCode.ipynb', 'repo_name': 'YenLinWu/DataScienceMarathon', 'size': '4746'}