NumPy 中的比较、掩码和布尔逻辑

已完成

掩码根据条件对数组中的值进行操作、计数或提取;例如,计算数组中大于特定值的所有值。 布尔掩码通常是在 NumPy 中完成此类任务的最有效方法。 它在清理和准备数据分析方面起着很大的作用。 (请参阅第 5 节。)

示例:计算下雨天数

接下来通过检查西雅图月降雨量统计信息来查看掩码的实际作用。 数据位于 data.gov 中的 CSV 文件中。 为了加载数据,我们将使用 pandas(我们将在第 4 节正式介绍该工具)。

import numpy as np
import pandas as pd

使用 pandas 提取降雨量作为 NumPy 数组。 请确保已克隆 Reactor 存储库,并在 VS Code 中打开 Learn/Intro-python-data-science 文件夹,如 环境设置单元中所述。 在此文件夹中,你将找到具有所需 CSV 文件的数据文件夹。

rainfall_2003 = pd.read_csv('Data/Observed_Monthly_Rain_Gauge_Accumulations_-_Oct_2002_to_May_2017.csv')['RG01'][ 2:14].values
rainfall_2003

输出为:

array([6.55, 1.61, 5.01, 2.27, 0.91, 0.49, 0.12, 0.33, 0.97, 6.32, 2.54,
       3.19])

接下来分解刚才在前面的代码单元中执行的操作。 降雨量数据包含围绕西雅图市的多个雨量计量器的月降雨量总计。 我们选择了第一个。 然后在该计量器中,选择了数据集中第一个完整日历年(2003 年)的相关月份。 该月份范围从 CSV 文件的第三行开始(请记住,Python 从零开始编制索引!),运行到第 13 行,因此为 2:14]

现在你有一个包含 12 个值的数组,其中每个值记录 2003 年 1 月到 12 月的月降雨量(以英寸为单位)。

在数据科学中,你通常需要先快速浏览一下数据。 在这种情况下,建议使用条形图。 为了生成此条形图,我们将使用 Matplotlib,这是我们稍后将在本课程中正式介绍的另一个重要数据科学工具。 (此示例还提供了你应采用的另一个广泛使用的 Python 约定:import matplotlib.pyplot as plt。)

%matplotlib inline
import matplotlib.pyplot as plt
plt.bar(np.arange(1, len(rainfall_2003) + 1), rainfall_2003)

输出为:

输出

12 个艺术家的 BarContainer 对象<>

BarContainer 对象。

让我们看看上面的代码片段。 我们向 pyplot 中的 bar 函数传递了两个参数。 第一个定义 x 轴的索引,第二个定义用于条形(y 轴)的数据。 若要创建索引,请使用 NumPy 函数 arange 创建一个数字序列。 (这与本节前面介绍的 arange 相同。)我们知道数组的长度为 12,但以编程方式传递数组的长度是一个好习惯,以防它发生变化或者你不知道它的特殊性。 我们还将 1 同时添加到 arange 的开头和结尾,以适应 Python 从零开始编制索引(因为日历中没有“0 月”)。

根据上述图表(居民可以证明),西雅图的夏天阳光明媚。 但这只是对数据的初步了解。 仍有几个问题需要回答。 例如,有几个月下雨,而且这几个月的平均降水量是多少? 我们将使用掩码来回答这些问题。 (我们还将返回到此示例数据集,以在本节其余部分演示概念。)

在深入说明掩码的含义之前,我们应简单了解 NumPy 中的比较运算符。

作为 ufuncs 的比较运算符

除了我们已讨论过的作为 ufuncs 的计算运算符之外,NumPy 还将 <(小于)和 >(大于)等比较运算符实现为元素 ufuncs。 所有标准 Python 比较运算都可用:

simple_array = np.array([1, 2, 3, 4, 5])

小于:

simple_array < 2 

输出为:

array([ True, False, False, False, False])

大于或等于:

simple_array >= 4

输出为:

array([False, False, False,  True,  True])

等于:

simple_array == 2

输出为:

array([False,  True, False, False, False])

还可以对两个数组进行元素比较,并可使用复合表达式:

(2 * simple_array) == (simple_array ** 2)

输出为:

array([False,  True, False, False, False])

与算术运算符一样,这些比较运算符是 NumPy ufuncs 的包装器。 写入 x < 3 时,NumPy 实际使用 np.less(x, 3)。 下面是比较运算符及其等效 ufuncs 的摘要:

运算符 等效 ufunc
== np.equal
< np.less
> np.greater
!= np.not_equal
<= np.less_equal
>= np.greater_equal

与算术 ufuncs 一样,比较 ufuncs 可处理任何大小和形状的数组。

rand = np.random.RandomState(0)
two_dim_array = rand.randint(10, size=(3, 4))
two_dim_array

输出为:

array([[5, 0, 3, 3],
       [7, 9, 3, 5],
       [2, 4, 7, 6]])

因此,对于:

two_dim_array < 6

输出为:

array([[ True,  True,  True,  True],
       [False, False,  True,  True],
       [ True,  True, False, False]])

结果为布尔数组,NumPy 提供了许多简单的模式来处理这些布尔值结果。