教程 | NumPy常用操作

简介: 在本文中,我们将简单介绍在机器学习和数据科学中应用最广的科学计算库,可以说它的高效令使用 Python 开发机器学习算法成为了可能。此外,我们也常认为正是因为 NumPy,Python 才可以像 MATLAB 那样高效地执行矩阵运算。

NumPy 是 Python 语言的一个扩充程序库。支持高效的多数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy 的科学计算十分高效,因此弥补了 Python 在运算效率上的不足。

在本文中,我们将简单介绍在机器学习和数据科学中应用最广的科学计算库,可以说它的高效令使用 Python 开发机器学习算法成为了可能。此外,我们也常认为正是因为 NumPy,Python 才可以像 MATLAB 那样高效地执行矩阵运算。

以下将开启我们的 NumPy 之旅:

import numpy as np

如上在 Python 内导入 NumPy 库,「np」简写即我们调用 NumPy 时约定俗成的命名。下面,我们分别创建了一个 Python 数组和 NumPy 数组:

image.png

以下分别打印了这两个变量的值与类型:

image.png

那么我们为什么要使用 NumPy 数组而不使用标准的 Python 数组呢?原因可能是 NumPy 数组远比标准数组紧密,在使用同样单精度变量下,NumPy 数组所需要的内存较小。此外,NumPy 数组是执行更快数值计算的优秀容器。

np.arange()

下面是另一种定义数组元素的方式:

image.png

其中 arange([start],stop,[step]) 声明了该数组元素起始与终止的值,而 step 定义了给定区间内采样的步幅大小。在以上代码中,我们生成一个从零开始到 10 结束(不包含 10),并且每次加 2 的数组。注意数组元素取值服从左闭右开原则,即取 0 而不取 10,停止数值并不能取到。

下面是另一个案例:

image.png

其实在 NumPy 中的数组可以等价的称之为矩阵或向量。所以当我们称矩阵的维度是 2×3 时,这并没有错误,我们同样还是在描述一个多维数组。如下展示了一个 2×3 阶矩阵:

image.png

现在我们可以讨论默认 NumPy 数组的形状(shape),即等同于讨论矩阵的维度。形状是 np 数组一个非常重要的属性,下面使用 shape 方法调用变量 A 的形状:

image.png

这是一个秩为 1 的矩阵,因此我们看到输出的形状只有一个元素。我们可以使用 reshape() 函数将该数组转化为我们想要的维度,如下,我们将 B 的形状转化为 3×3,reshape() 方法将会返回一个多维数组,因此它的左右分别有两个方括号。

因为 Python 定义的列表没有 reshape() 方法,该博客给出的标准数组会报错。我们只能对 NumPy 数组执行 reshape。此外,执行 reshape 方法要求转化前和转化后的元素数量是一样的。

image.png

我们可以如下输出 B 的形状:

image.png

np.zeros()

下面,我们可以使用 np.zero() 函数生成一个元素全是零的矩阵。如下在给定需要生成矩阵的形状后,其就能自动填充零值:

image.png

np.zeros((n,m)) 将返回一个 n*m 阶矩阵,其中每个值都为零。

np.eye()

eye() 方法将生成一个单位矩阵:

image.png

np.eye(n) 将生成一个 n 阶单位方阵,即一个 n 阶矩阵,其主对角线元素都为 1,其它元素都为 0。

np.dot()

矩阵乘法在机器学习中十分重要,以下展示了怎样使用 NumPy 执行矩阵乘法。我们一般使用 np.dot() 执行矩阵乘法,即点积。执行该乘法的前提是左边矩阵的列数(每行的元素)必须等于右边矩阵的行数,否则就会报错。此外,根据矩阵乘法的定义,左乘和右乘也不一样,这一点我们需要注意。

若 A=(2,3),而 B=(3,2),那么 A 左乘 B 就要求 A 的列数 3 等于 B 的函数 3。下面展示了 NumPy 矩阵乘法:

image.png

以上定义了两个矩阵,下面则执行矩阵 D 左乘矩阵 I:

image.png

np.sum()

np.sum() 会将整个矩阵的所有元素加和为一个标量值:

image.png

此外,我们还可以提供参数以确定到底是沿矩阵的行累加还是沿矩阵的列累加。如下我们给定参数 axis=1,其代表将每一行的元素累加为一个标量值。

image.png

第一行累加为 6、第二行累加为 15、第三行累加为 24。此外,给定参数 axis=0 则表示沿列累加:

image.png

第一列累加为 12、第二列累加为 15、第三列累加为 18。

np.random.rand()

我们可以使用 np.random.rand() 随机生成矩阵,即给定矩阵的形状,其中每个元素都是随机生成的。如下随机生成了一个 2×2 矩阵:

image.png

当然我们也能扩展到随机生成更高维度的矩阵:

np.append()

如果我们需要手动地给一个数组添加一个或多个元素,那么我们可以使用 np.append()。

image.png

下面使用 np.append() 添加一个元素到数组 A 中:

image.png

np.append() 同样可以将一个具体的数组添加到已有的数组中:

image.png

如上我们将一个列表及其元素添加到了 np 数组中。

image.png

np.diff()

若给定一个数组,我们该如何求取该数组两个元素之间的差?NumPy 提供了 np.diff() 方法以求 A[n+1]-A[n] 的值,该方法将输出一个由所有差分组成的数组。

image.png

我们需要注意执行差分运算后的数组要比原数组的元素少 1 位。其中 n=1 代表执行一次求差分,并返回差分的数组。而 n=2 代表执行两次差分,并返回第二次求差分后的数组。第二次求差分是在第一次差分结果数组上进行的。如下对 A 求两次差分等价于对上文 B 再求一次差分。

image.png

np.vstack() 和 np.column_stack()

若我们希望将多个向量或矩阵按一定的方法堆叠成新的矩阵,那么 np.vstack() 和 np.column_stack() 方法将帮助我们实现这一操作。以下定义三个行向量:

image.png

堆叠一共有两种变体,即按行堆叠还是按列堆叠。按行堆叠即将需要的向量或矩阵作为新矩阵的一个行,按列堆叠即一个向量作为新矩阵的一列。以下展示了 np.vstack((a,b,c)) 如何将向量 a、b、c 分别作为新矩阵的第一行、第二行和第三行:

image.png

此外,np.column_stack() 可以将每个元素作为一列,例如 np.column_stack((a,b,c)) 就将向量 a 作为第一列、b 作为第二列、c 作为第三列:

image.png

np 数组索引

NumPy 数组的索引方式和 Python 列表的索引方式是一样的,从零索引数组的第一个元素开始我们可以通过序号索引数组的所有元素。例如 A[i] 索引数组 A 中的第 i+1 个元素。此外,我们还能索引一串元素:

image.png

如上 A[2:5] 索引了数组 A 中第 3 到第 5 个元素,注意 Python 列表和数组的索引都是左闭右开,即 A 中包含 2 索引的元素而不包含 5 索引的元素:

A[lowerbound(inclusive): upperbound(exclusive)]

广播操作

广播操作是 NumPy 非常重要的一个特点,它允许 NumPy 扩展矩阵间的运算。例如它会隐式地把一个数组的异常维度调整到与另一个算子相匹配的维度以实现维度兼容。所以将一个维度为 [3,2] 的矩阵与一个维度为 [3,1] 的矩阵相加是合法的,NumPy 会自动将第二个矩阵扩展到等同的维度。

为了定义两个形状是否是可兼容的,NumPy 从最后开始往前逐个比较它们的维度大小。在这个过程中,如果两者的对应维度相同,或者其一(或者全是)等于 1,则继续进行比较,直到最前面的维度。若不满足这两个条件,程序就会报错。

如下展示了一个广播操作:

image.png

严格数学意义上,a 和 b 是不能执行矩阵乘法的,因为它们的维度不符合要求。但在 NumPy 的广播机制下,维度为 1 的项何以扩展到相应的维度,所以它们就能够执行运算。

矩阵的运算

以下执行了矩阵的转置操作:

image.png

运算矩阵的迹:

image.png

此外,numpy.linalg 模块中有很多关于矩阵运算的方法,如下据算矩阵的特征值与特征向量:
nplg

image.png

原文地址:https://hackernoon.com/@rakshithvasudev

源 / 机器之心

文章来源:微信公众号 机器学习算法与Python学习

目录
相关文章
|
3月前
|
数据可视化 Python
NumPy 教程 之 NumPy Matplotlib 7
使用Python的绘图库Matplotlib与NumPy结合进行数据可视化,提供Matplotlib作为MatLab开源替代方案的有效方法,以及如何利用plt()函数将数据转换成直观的直方图示例。
42 11
|
3月前
|
Python
NumPy 教程 之 NumPy Matplotlib 6
Matplotlib 是一个强大的 Python 绘图库,能与 NumPy 协同工作,提供类似 MatLab 的开源替代方案,并支持 PyQt 和 wxPython 等图形工具包。通过 `numpy.histogram()` 函数示例,展示了如何创建数据频率分布图,该函数接受输入数组和 bin 参数,生成对应频率的直方图。示例代码及输出清晰展示了 bin 的边界与对应频率的关系。
35 11
|
3月前
|
Python
NumPy 教程 之 NumPy Matplotlib 4
使用 Python 的绘图库 Matplotlib,结合 NumPy,生成各种图形,作为 MatLab 的开源替代方案。您将学习到如何用 matplotlib 和 NumPy 包来创建正弦波图形,以及如何在同一图中利用 subplot() 函数组织和展示不同的子图,例如同时绘制正弦和余弦曲线。通过实际代码示例,加深对这些功能的理解。
43 12
|
3月前
|
Python
NumPy 教程 之 NumPy Matplotlib 3
使用Python的绘图库Matplotlib与NumPy结合,创建有效的MatLab开源替代方案。它还支持与PyQt和wxPython等图形工具包搭配使用。通过向`plot()`函数添加特定格式字符串,可以展示离散值而非线性图。提供了多种线型和标记选项,例如实线`-`、虚线`--`、点标记`.`等,以及颜色缩写如蓝色`b`、绿色`g`等。示例代码展示了如何用圆点表示数据点而非线条。
40 10
|
3月前
|
Python
NumPy 教程 之 NumPy Matplotlib 5
Matplotlib 是 Python 的绘图库,配合 NumPy 可作为 MatLab 的开源替代方案,并能与 PyQt 和 wxPython 等图形工具包共同使用。本教程重点讲解 `bar()` 函数用于生成条形图的方法,并通过实例展示了如何创建并显示两组数据的条形图。
36 7
|
3月前
|
存储 Python
NumPy 教程 之 NumPy IO 1
NumPy IO 教程介绍了如何使用 NumPy 读写文本及二进制数据。教程覆盖了 `.npy` 和 `.npz` 格式的文件操作,其中 `save()` 和 `load()` 函数用于单个数组的存取,而 `savez()` 则可以保存多个数组。文本文件处理则由 `loadtxt()` 和 `savetxt()` 完成。通过示例展示了 `numpy.save()` 函数的具体用法,并解释了其参数含义,如文件名、数组对象以及序列化选项等。
44 10
|
3月前
|
Python
NumPy 教程 之 NumPy Matplotlib 2
Matplotlib 是 Python 的绘图库,能与 NumPy 结合使用,提供 MatLab 的开源替代方案,并支持 PyQt 和 wxPython 等图形工具包。由于 Matplotlib 默认不支持中文,可以使用思源黑体等字体或系统自带的中文字体(如仿宋)解决这一问题,通过指定字体路径或设置 `plt.rcParams['font.family']` 来实现中文显示。
25 1
|
3月前
|
存储 Ubuntu 数据可视化
NumPy 教程 之 NumPy Matplotlib 1
Matplotlib作为Python的绘图库,能够与NumPy结合使用,提供了类似MatLab的开源替代方案,并支持与PyQt和wxPython等图形工具包一同使用。本教程将指导你如何在不同系统环境下安装matplotlib,并通过实例演示如何利用它进行数据可视化,包括创建坐标轴标签、绘制线性图表并展示结果。
26 1
|
3月前
|
Python
NumPy 教程 之 NumPy Matplotlib 4
NumPy 教程 之 NumPy Matplotlib 4
13 0
|
3月前
|
存储 Python
NumPy 教程 之 NumPy IO 3
NumPy 支持读写文本与二进制数据,提供 `.npy` 格式保存 `ndarray`。常用函数包括:`save()`、`load()` 用于 `.npy` 文件的写入和读取;`savez()` 将多数组存为 `.npz` 格式;`savetxt()` 和 `loadtxt()` 处理 `.txt` 文件,支持自定义分隔符等选项。示例展示了如何使用 `savetxt()` 和 `loadtxt()` 进行数据存储及读取。
32 0