赞
踩
除了整数型数组和浮点型数组,还有一种有用的数组类型——布尔型数组。
由于 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]
有三个关于 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 分的裸考者。
若一个普通数组和一个布尔型数组的维度相同,可以将布尔型数组作为普通 数组的掩码,这样可以对普通数组中的元素作筛选。给出两个示例。
第一个示例,筛选出数组中大于、等于或小于某个数字的元素。
- 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]
现在我们来思考一种情况:假设一个很长的数组,我想知道满足某个条件的 元素们所在的索引位置,此时使用 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( )函数的输出看起来比较怪异,它是输出了一个元组。元组第一个 元素是“满足条件的元素所在位置”;第二个元素是数组类型,可忽略掉。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。