数据分析手册-numpy数组(5)--比较通用函数与操作布尔数组
和通用函数类似的比较操作
前面介绍了通用函数,并且特别关注了算术运算符。我们用+、-、*、/和其他一些运算符介绍了数组的逐元素操作。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提供了一些简明的模式来操作这些布尔结果。
操作布尔数组
给定一个布尔数组,你可以实现很多有用的操作。
- 统计记录的个数
如果需要统计布尔数组中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
-
布尔运算符
接前面的降水量的例子,如果我们想要统计降水量小于4英寸且大于2英寸的天数,很明显的,我们需要用到python的逐位逻辑运算符 &、|、^和~来实现,和标准的算术运算符一样,Numpy同样有对应的通用函数重载了这些逻辑运算符,这样可以实现数组的逐位运算(通常是布尔运算)。
举个栗子吧:
np.sum((inches>0.5)&(inches<1)) #output 29
上面就可以得降水量在0.5英寸~1英寸间的天数是29天。
下面说几个注意点:
-
括号是十分重要的–因为运算优先级原则
-
可以使用基础逻辑课程学到的不同等价方式来进行运算
将比较运算符和布尔运算符合并起来用在数组上,可以实现更多有效的逻辑操运算操作。
本文地址:https://blog.csdn.net/weixin_45870904/article/details/110500447