欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据分析手册-numpy数组(5)--比较通用函数与操作布尔数组

程序员文章站 2022-06-22 16:31:59
和通用函数类似的比较操作前面介绍了通用函数,并且特别关注了算术运算符。我们用+、-、*、/和其他一些运算符介绍了数组的逐元素操作。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,Fa...

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

前面介绍了通用函数,并且特别关注了算术运算符。我们用+、-、*、/和其他一些运算符介绍了数组的逐元素操作。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