【Numpy學習12】邏輯函式

Xiao_Spring發表於2020-10-28

前言

關於邏輯函式的內容,我們在之前11章或多或少都穿插過一些,這裡我們就做一個簡單的整理。

1.真值測試

真值測試包含np.all()np.any()兩種方法:

  • np.all()判斷是否全為真:如果是就返回True;否則返回False。
  • np.any()判斷是否至少有一個為真:如果有就返回True;否則返回False。

舉例:

【例1】真值測試舉例

>>> a = np.random.randint(0,5,10)
>>> b = np.random.randint(0,5,10)
>>> print(a)
[4 1 0 2 4 0 1 0 4 4]
>>> print(b)
[0 2 1 4 4 2 4 2 0 0]
>>> print(np.all(a==a))
True
>>> print(np.all(a==b))
False
>>> print(np.any(a==b))
True
>>> print(np.all([2,np.nan]))
True

其實a==a,a==b只是一個前置環節,目的是為了拿到布林型別的陣列便於真值判斷。

而真值判斷的不僅僅是True和False,0和非0等。如上面最後一個例子,numpy中的nan並不是空物件,其實際上是numpy.float64物件,所以我們不能誤認為其是空物件,從而用bool(np.nan)去判斷是否為空值,這是不對的。

2.陣列內容

如上,nan型別並不能通過np.all()區分,那麼需要有一種方法判斷一個元素是否為nan,所以numpy提供了np.isnan()來判斷:

【例2】isnan()舉例

>>> print(np.isnan([2,3.0,np.nan,4]))
[False False  True False]

3.邏輯運算

我們之前已經見過一些常見的邏輯運算,現在讓我們來歸納一下:

  • not 邏輯非
  • and 邏輯與
  • or 邏輯或
  • xor 邏輯異或
>>> a = np.random.randint(0,5,10)>3
>>> print(a)
[False False False  True False  True False False False  True]
>>> b = np.random.randint(0,5,10)<2
>>> print(b)
[False False  True False  True False False False  True  True]
>>> print(np.logical_not(a))
[ True  True  True False  True False  True  True  True False]
>>> print(np.logical_and(a,b))
[False False False False False False False False False  True]
>>> print(np.logical_or(a,b))
[False False  True  True  True  True False False  True  True]
>>> print(np.logical_xor(a,b))
[False False  True  True  True  True False False  True False]

4.對照

  • greater: >
  • greater_equal: >=
  • equal: ==
  • not_equal: !=
  • less: <
  • less_equal: <=
  • isclose:是否接近
  • allclose:是否全部接近

其中它們返回的都是布林型別的ndarray資料型別。

>>> a = np.random.randint(0,5,10)
>>> print(a)
[3 1 4 1 0 0 4 1 0 4]
>>> print(np.greater(a,2))
[ True False  True False False False  True False False  True]
>>> print(np.greater_equal(a,2))
[ True False  True False False False  True False False  True]
>>> print(np.less(a,3))
[False  True False  True  True  True False  True  True False]
>>> print(np.less_equal(a,3))
[ True  True False  True  True  True False  True  True False]
>>> print(np.equal(a,2))
[False False False False False False False False False False]
>>> print(np.not_equal(a,2))
[ True  True  True  True  True  True  True  True  True  True]
>>> print(np.isclose([1e10,1e-8], [1.0001e10,1e-9]))
[False  True]

allclose等同於isclose+logical_and的功能,isclose(a,b)返回True的前提是:

absolute(a - b) <= (atol + rtol * absolute(b))

而atol,rtol有預設值:

在這裡插入圖片描述
分別是1e-05和1e-08。

注意,上面的例子np.isclose([1e10,1e-8], [1.0001e10,1e-9])特別容易把[1e10,1e-8]和[1.0001e10,1e-9]分別各自計算,而忘了這是numpy的向量化特性,應該a1和b1計算,a2和b2計算,而不是交叉。

相關文章