和通用函数类似的比较操作

前面介绍了通用函数,并且特别关注了算术运算符。我们用+、-、*、/和其他一些运算符介绍了数组的逐元素操作。numpy还实现了如<(小于)和>(大于)的逐元素比较的通用函数。这些比较运算的结果是一个布尔类型的数组。一共有6种标准的比较操作:

x=np.array([1,2,3,4,5])
x<3 #小于
array([True, True,False,False,False], dtype=bool)
x>3 #大于
array([False,False,False, True, True], dtype=bool)
x<=3 #小于等于
array([ True, True, True, False, False], dtype=bool)
x>=3 #大于等于
array([False, False, True, True, True], dtype=bool)
x!=3 #不等于
array([ True, True, False, True, True], dtype=bool)
x==3 #等于
array([False, False, True, False, False], dtype=bool)

另外,利用复合表达式实现对两个数组的逐元素比较也是可行的

(2 * x)==(x**2)
array([False, True, False, False, False],dtype=bool)

和算术运算符一样,比较运算操作在Numpy种也是借助通用函数来实现的。例如当你写x<3时,Numpy内部会使用np.less(x, 3).这些比较运算符和对应的通用函数如下表所示。

运算符 对应的通用函数
== np.equal
!= np.not_equal
< np.less
<= np.less_equal
> np.greater
>= np.greater_equal

和算术运算通用函数一样,这些比较通用函数也可以用于任意形状、大小的数组。下面是一个二维数组的示例:

rng=np.random.RandomState(0)
x= rng.randint(10,size=(3,4))
 array([[5,0,3,3],
        [7,9,3,5]
        [2,4,7,6]])
x<6
array([[ True, True, True, True],
       [False,False, True, True],
       [ True, True, False,Flase]],dtype=bool)

这样每次计算的结果都是布尔数组了。NumPy提供了一些简明的模式来操作这些布尔结果。

操作布尔数组

给定一个布尔数组,你可以实现很多有用的操作。

  1. 统计记录的个数

如果需要统计布尔数组中True记录的个数,可以使用np.count_nonzero函数 ps(nonzero也就是找1,也就是找True记录的个数):

还有一种实现方式是利用np.sum,在这个例子中,False会被解释成0,True会被解释成1:

np.sum(x<6)
8

sum()的好处是,和其他Numpy聚合函数一样,这个求和也可以沿着行或者列进行:

# 每行有多少个值小于6?
np.sum(x<6, axis=1)
array([4,2,2])
#这是矩阵中每一行小于6的个数。

如果要快速检查任意或者所有这些值是否为True,可以用np.any()或者np.all()–用中文意思理解即可,一个是是否有,一个是是否所有:

#有没有值大于8
np.any(x>8)
True
#有没有值小于0
np.any(x<0)
False
# 是否所有值都小于10?
np.all(x<10)

当然,np.all( )和np.any( )也可以沿着特定的坐标轴,例如

# 是否每行的所有值都小于8?
np.all(x<8, axis=1)
# output
array([ True, False, True],dtype=bool)

这里的例子因为第一行和第三行的所有元素都小于8,而第2行不是所有元素都小于8.

attention!python有内置的sum( )、any()和all()函数,这些函数在Numpy中有不同的语法版本。

一定不要在多维数组中同时使用两者的这几种函数,否则很容易造成一些不可预知的错误。

所以,在使用聚合函数时候一定要记得加上np.的prefix

  1. 布尔运算符

    接前面的降水量的例子,如果我们想要统计降水量小于4英寸且大于2英寸的天数,很明显的,我们需要用到python的逐位逻辑运算符 &、|、^和~来实现,和标准的算术运算符一样,Numpy同样有对应的通用函数重载了这些逻辑运算符,这样可以实现数组的逐位运算(通常是布尔运算)。

    举个栗子吧:

    np.sum((inches>0.5)&(inches<1))
    #output 29
    

​ 上面就可以得降水量在0.5英寸~1英寸间的天数是29天。

​ 下面说几个注意点:

  1. 括号是十分重要的–因为运算优先级原则

  2. 可以使用基础逻辑课程学到的不同等价方式来进行运算

    将比较运算符和布尔运算符合并起来用在数组上,可以实现更多有效的逻辑操运算操作。

本文地址:https://blog.csdn.net/weixin_45870904/article/details/110500447