当前位置:   article > 正文

Python库系列numpy(7)---布尔型数组_python将数组中元素转换为布尔型

python将数组中元素转换为布尔型

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

7.1 创建布尔型数组

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

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

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

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

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

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

1.2 布尔型数组中 True 的数量

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

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

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

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

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

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

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

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

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

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

1.3 布尔型数组作为掩码

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

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

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

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

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

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/175945
推荐阅读
相关标签
  

闽ICP备14008679号