【Numpy学习12】逻辑函数

前言

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

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页