前言
关于逻辑函数的内容,我们在之前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计算,而不是交叉。