Numpy 是什么?

Numpy 是一个用于操作数值数据列表和表格的 Python 包。我们可以使用它进行许多统计计算。我们将数据列表或表格称为 numpy 数组(Numpy Array)。

通常,我们会从 Pandas DataFrame 中获取数据并将其放入 numpy 数组中。Pandas DataFrame 非常棒,因为我们有列名和其他文本数据,使其易于人类阅读。虽然 DataFrame 对人类来说易读,但并不是进行计算的理想格式。相比之下,numpy 数组通常不太容易阅读,但是却是进行必要计算的理想格式。

事实上 Pandas 的底层是用 Numpy 作为基础来开发的。

将 Pandas Series 转换成 Numpy Array

我们经常使用 Pandas 来读取数据,所以得到的也是 Pandas DataFrame。如果需要将其转换成 numpy array,可以使用 values 属性直接获取。对于 Pandas Series,具体操作如下,比如我们需要将 Fare 列表转换成 numpy array

import pandas as pd
df = pd.read_csv('https://kingsmai.github.io/uploads/@files/datasets/titanic/train.csv')
print(df['Fare'].values)

得到的数据如下:

[  7.25    71.2833   7.925   53.1      8.05     8.4583  51.8625  21.075 ...... ]

返回值是一个 一维数组。因为我们转换的是 Pandas Series,所以得到的值是一个一维数组。能理解吧?

Series.values 属性就是用来获取 Pandas Series 的 numpy array 形式的数据的。

将 Pandas DataFrame 转换成 Numpy Array

如果需要转换的数据是 DataFrame,同样的可以使用 DataFrame.values,但是它的返回值将会是一个 二维数组。比如我们需要获取:舱位信息、票价和年龄的 numpy array,可以这么操作:

print(df[['Pclass', 'Fare', 'Age']].values)

得到的数据如下:

[[ 3.      7.25   22.    ]
[ 1. 71.2833 38. ]
[ 3. 7.925 26. ]
...
[ 3. 23.45 7. ]
[ 1. 30. 26. ]
[ 3. 7.75 32. ]]

Numpy Shape 属性

shape 属性用来得到一组 numpy array 的维度(宽 高)。这个数据将告诉我们数据集中有多少行多少列。同样的,我们来获取三个列的 shape,看看其返回值为:

arr = df[['Pclass', 'Fare', 'Age']].values
print(arr.shape)

返回值为 (887, 3) 说明这个数据集有 887 行,3 列数据。

除了 numpy array 可以使用 shape 属性获取它的行列值之外,DataFrame 同样也可以获取:df.shape

从 Numpy Array 中获取数据

我们定义了一个数组,存放了乘客的舱位信息、票价和年龄,那么我们可以像操作数组一样,对 Numpy Array 进行操作。如下所示,获取 Numpy Array 数组中第一行第二列的数据:

arr = df[['Pclass', 'Fare', 'Age']].values
print(arr[0, 1])

同样的,我们可以选择一行,直接输出正行数据

print(arr[0])

但是如果我们需要选取一列的数据,那么就要通过以下代码进行完成,如我们需要获取乘客的年龄信息(第 3 列)

print(arr[:, 2])

是不是觉得很眼熟?没错,这就是 Python 中数组的 slice 用法。原理就是获取全部行 : 然后获取下表为 2 的列。

通过不同的语法规则(syntax),我们可以获取 numpy array 中的 值,整行,整列。

遮罩 Masking

一般情况下,我们希望选择的数据是符合某些条件的。比如说选择符合某条件的所有行。在以下例子中,我们将选择所有儿童(年龄小于 18 岁的乘客)。要做到这点,我们需要

  1. 获取我们的数组(舱位等级,票价,年龄),得到他们的 numpy array
arr = df[['Pclass', 'Fare', 'Age']].values
  1. 获取 age 列的数组,用于后面的判断
arr[:, 2]
  1. 【重点】接下来,我们需要创建一个我们称之为掩码(Mask)的东西。这是一个包含布尔值的数组,表示乘客是否为儿童
mask = arr[:, 2] < 18

我们可以输出这段 mask,看他是什么:

[False, False, False, False, False, False, False, True, False, ...]

其中,False 表示是成年人,True 表示儿童。现在我们使用创建好的掩码只选择我们关心的行,操作方法就是将 mask 数组当作索引放入 arr 数组中

arr[mask]

通常,我们不需要额外取创建 mask 变量来保存掩码,我们可以通过一行代码直接完成上述功能。

arr[arr[:, 2] < 18]

掩码 Mask 就是一组布尔值的数组,用来告诉 python 我们对哪些数据感兴趣。

总和与计算

如果说我们需要在刚刚处理好的小孩数据中获取到具体有多少个小孩,那么我们可以这么操作。因为 mask 获得的值,符合条件的为 True,可以被解释为 1;反之为 0。所以我们可以通过 mask.sum(),得到统计。

arr = df[['Pclass', 'Fare', 'Age']].values
mask = arr[:, 2] < 18
print(mask.sum())

同样的,我们也可以跳过定义 mask 变量

print((arr[:, 2] < 18).sum())

将布尔值数组进行求和,将会得到 True 为 1 的数量。