图解NumPy,这是形象理解数组的一份教程
作者:媒体转发 时间:2019-07-16 21:50
NumPy 软件包是 Python 生态系统中数据分析、机器学习和科学计算的主力军。它极大地简化了向量和矩阵的操作处理。Python 的一些主要软件包(如 scikit-learn、SciPy、pandas 和 tensorflow)都以 NumPy 作为其架构的基础部分。除了能对数值数据进行切片(slice)和切块(dice)之外,使用 NumPy 还能为处理和调试上述库中的高级实例带来极大便利。

本文将介绍使用 NumPy 的一些主要方法,以及在将数据送入机器学习模型之前,它如何表示不同类型的数据(表格、图像、文本等)。
import numpy as np
创建数组
我们可以通过传递一个 python 列表并使用 np.array()来创建 NumPy 数组(极大可能是多维数组)。在本例中,python 创建的数组如下图右所示:

通常我们希望 NumPy 能初始化数组的值,为此 NumPy 提供了 ones()、zeros() 和 random.random() 等方法。我们只需传递希望 NumPy 生成的元素数量即可:

一旦创建了数组,我们就可以尽情对它们进行操作。
数组运算
让我们创建两个 NumPy 数组来展示数组运算功能。我们将下图两个数组称为 data 和 ones:

将它们按位置相加(即每行对应相加),直接输入 data + ones 即可:

当我开始学习这些工具时,我发现这样的抽象让我不必在循环中编写类似计算。此类抽象可以使我在更高层面上思考问题。
除了「加」,我们还可以进行如下操作:

通常情况下,我们希望数组和单个数字之间也可以进行运算操作(即向量和标量之间的运算)。比如说,我们的数组表示以英里为单位的距离,我们希望将其单位转换为千米。只需输入 data * 1.6 即可:

看到 NumPy 是如何理解这个运算的了吗?这个概念叫做广播机制(broadcasting),它非常有用。
索引
我们可以我们像对 python 列表进行切片一样,对 NumPy 数组进行任意的索引和切片:

聚合
NumPy 还提供聚合功能:

除了 min、max 和 sum 之外,你还可以使用 mean 得到平均值,使用 prod 得到所有元素的乘积,使用 std 得到标准差等等。
更多维度
上述的例子都在一个维度上处理向量。NumPy 之美的关键在于,它能够将上述所有方法应用到任意数量的维度。
1. 创建矩阵
我们可以传递下列形状的 python 列表,使 NumPy 创建一个矩阵来表示它:
np.array([[1,2],[3,4]])
我们也可以使用上面提到的方法(ones()、zeros() 和 random.random()),只要写入一个描述我们创建的矩阵维数的元组即可:

2. 矩阵运算
如果两个矩阵大小相同,我们可以使用算术运算符(+-*/)对矩阵进行加和乘。NumPy 将它们视为 position-wise 运算:




