Python库系列numpy(7)---布尔型数组

除了整数型数组和浮点型数组,还有一种有用的数组类型——布尔型数组。

7.1 创建布尔型数组

由于 NumPy 的主要数据类型是整数型数组或浮点型数组,因此布尔型数组 的产生离不开:大于>、大于等于>=、等于==、不等号!=、小于<、小于等于<=。 首先,我们将数组与系数作比较,以产生布尔型数组,示例如下。

import numpy as np
# 创建数组
arr = np.arange(1,7).reshape(2,3)
print(arr)
#输出[[1 2 3]
#    [4 5 6]]
# 数组与数字作比较
print( arr >= 4 )
#输出[[False False False]
#    [True True True]] 

其次,我们将同维数组作比较,以产生布尔型数组,示例如下。

import numpy as np
# 创建同维数组
arr1 = np.arange(1,6)
arr2 = np.flipud(arr1)
print(arr1)
print(arr2)
#输出[1 2 3 4 5]
#   [5 4 3 2 1]
# 同维度数组作比较
print( arr1 > arr2)
#输出[False False False True True]

最后,还可以同时比较多个条件。Python 基础里,同时检查多个条件使用的 与、或、非是 and、or、not。但 NumPy 中使用的与、或、非是 & 、 | 、 ~ 。

import numpy as np
# 创建数组
arr = np.arange(1,10)
print(arr)
#输出[1 2 3 4 5 6 7 8 9]
# 多个条件
print( (arr < 4) | (arr > 6) )
#输出[ True True True False False False True True True]

1.2 布尔型数组中 True 的数量

有三个关于 Ture 数量的有用函数,分别是 np.sum( )、np.any( )、np.all( )。

np.sum( )函数:统计布尔型数组里 True 的个数。示例如下。

import numpy as np
# 创建一个形状为 10000 的标准正态分布数组
arr = np.random.normal( 0,1,10000 )
# 统计该分布中绝对值小于 1 的元素个数
num = np.sum( np.abs(arr) < 1 ) 
print( num )
#输出6814

在示例里,np.abs(arr) < 1 可以替换为 (arr>-1) &(arr<1) 。此外,最终统计 的数量为 6814,其概率近似为 0.6827,这符合统计学中的 3σ 准则。

np.any( )函数:只要布尔型数组里含有一个及其以上的 True,就返回 True。

import numpy as np
# 创建同维数组
arr1 = np.arange(1,10)
arr2 = np.flipud(arr1)
print(arr1)
print(arr2)
#输出[1 2 3 4 5 6 7 8 9]
#   [9 8 7 6 5 4 3 2 1]
# 统计这两个数组里是否有共同元素
print( np.any( arr1 == arr2 ) )
#输出True

从结果来看,arr1 与 arr2 里含有共同元素,那就是 5。

np.all( )函数:当布尔型数组里全是 True 时,才返回 True,示例如下。

import numpy as np
# 模拟英语六级的成绩,创建 100000 个样本
arr = np.random.normal( 500,70,100000 )
# 判断是否所有考生的分数都高于 250
print( np.all( arr > 250 ) )
#输出False

从结果来看,尽管 3σ 准则告诉我们有 99.73%的考生成绩高于 290 分(290 通过500 3 70 −  计算得到),但仍然有最终成绩低于 250 分的裸考者。

1.3 布尔型数组作为掩码

        若一个普通数组和一个布尔型数组的维度相同,可以将布尔型数组作为普通 数组的掩码,这样可以对普通数组中的元素作筛选。给出两个示例。

         第一个示例,筛选出数组中大于、等于或小于某个数字的元素。

import numpy as np
# 创建数组
arr = np.arange(1,13).reshape(3,4)
print(arr)
#输出[[01 02 03 04]
#    [05 06 07 08]
#    [09 10 11 12]]
# 数组与数字作比较
print( arr > 4 )
#输出[[False False False False]
#    [ True True True True]
#    [ True True True True]]
# 筛选出 arr > 4 的元素
print( arr[ arr > 4 ] )
#输出[05 06 07 08 09 10 11 12]

注意,这个矩阵进行掩码操作后,退化为了向量。

第二个示例,筛选出数组逐元素比较的结果。

import numpy as np
# 创建同维数组
arr1 = np.arange(1,10)
arr2 = np.flipud(arr1)
print(arr1)
print(arr2)
#输出[1 2 3 4 5 6 7 8 9]
#   [9 8 7 6 5 4 3 2 1]
# 同维度数组作比较
print( arr1 > arr2)
#输出[False False False False False True True True True]
# 筛选出 arr1 > arr2 位置上的元素
print( arr1[ arr1 > arr2 ] )
print( arr2[ arr1 > arr2 ] )
#输出[6 7 8 9]
#   [4 3 2 1]

1.4 满足条件的元素所在位置

现在我们来思考一种情况:假设一个很长的数组,我想知道满足某个条件的 元素们所在的索引位置,此时使用 np.where( )函数。

import numpy as np
# 模拟英语六级成绩的随机数组,取 10000 个样本
arr = np.random.normal( 500,70,1000 )
# 找出六级成绩超过 650 的元素所在位置
print( np.where( arr > 650 ) )
#输出(array([127, 129, 317, 342, 484, 490, 634, 658, 677, 755, 763, 819, 820,
# 853, 926, 932, 982], dtype=int64),)
# 找出六级成绩最高分的元素所在位置
print( np.where( arr == np.max(arr) ) )
#输出(array([342], dtype=int64),)

np.where( )函数的输出看起来比较怪异,它是输出了一个元组。元组第一个 元素是“满足条件的元素所在位置”;第二个元素是数组类型,可忽略掉。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值