本文是 Python 科学计算库numpy
、scipy
及matplotlib
的快速入门教程,翻译自斯坦福大学 CS231n - Python NumPy Tutorial 。
NumPy
NumPy是Python中科学计算的核心库。它提供了一个高性能的多维数组对象,以及使用这些数组的工具。
数组
NumPy的核心功能是"ndarray"(即n-dimensional array,多维数组) 数据结构。这是一个表示多维度、同质并且固定大小的数组对象。维数是数组的秩 rank
; 数组的形状 shape
是一个整数元组,表示沿着每个维度的数组大小。
我们可以从嵌套的Python列表初始化numpy数组,并使用方括号来访问元素:
1 | import numpy as np |
NumPy还提供许多创建数组的函数:
1 | import numpy as np |
你可以在 这份文档 中阅读关于数组创建的其他方法。
数组索引
NumPy提供了多种索引到数组的方法。
切片:与Python列表类似,可以对numpy数组进行切片。由于数组可能是多维的,因此必须为数组的每个维度指定一个切片:
1 | import numpy as np |
你还可以将整数索引与片段索引进行混合。但是,这样做会产生比原始数组更低的数组:
1 | import numpy as np |
整数数组索引:当你使用切片索引到numpy数组时,生成的数组视图将始终是原始数组的子数组。 相反,整数数组索引允许你使用另一个数组的数据来构造任意数组。 例如:
1 | import numpy as np |
一个有用的整数数组索引技巧,是从矩阵的每一行中选择一个元素:
1 | import numpy as np |
布尔数组索引:布尔数组索引可以让你选择数组的任意元素。通常,这种类型的索引用于选择满足某些条件的数组的元素。例如:
1 | import numpy as np |
为了简洁起见,我们省略了很多有关numpy数组索引的细节;如果你想了解更多,请阅读 这份文档 。
数组计算
基本的数学函数在数组上按元素运算,并且可以作为运算符重载和numpy模块中的函数使用:
1 | import numpy as np |
请注意,*
是元素乘法,而不是矩阵乘法。如需使用矩阵乘法,请使用函数dot
。dot
可用作numpy模块中的函数,也可用作数组对象的实例方法:
1 | import numpy as np |
NumPy提供了许多有用的矩阵计算函数;其中最重要的函数之一是sum
:
1 | import numpy as np |
你可以在 这份文档 中找到numpy提供的数学函数完整列表。
除了使用数组计算数学函数之外,我们经常需要重新整形或以其他方式处理数组中的数据。 这种类型的操作的最简单的例子是转置矩阵;要转置矩阵,只需使用数组对象的T
属性:
1 | import numpy as np |
NumPy提供了更多的功能来操作数组;你可以在 这份文档 中看到完整列表。
广播
广播是一种强大的机制,允许numpy在执行算术运算时使用不同形状的数组。 通常我们有一个更小的数组和一个更大的数组,我们想要使用较小的数组多次来对较大的数组执行一些操作。
例如,假设我们要为矩阵的每一行添加一个常量向量。 我们可以这样做:
1 | import numpy as np |
这种方法是可以的;然而,当矩阵x
非常大时,Python循环可能会运行很长时间。实际上,将向量v
添加到矩阵x
的每一行,等价于通过创建垂直堆叠v
的矩阵vv
,然后执行x
和vv
的元素求和。我们可以这样实现这个方法:
1 | import numpy as np |
NumPy的广播允许我们在不创建v
的多个副本的情况下执行这个计算。以上情况下,我们可以使用广播:
1 | import numpy as np |
即使 x
具有形状 (4, 3)
且v
具有形状 (3,)
,行y = x + v
可以正常执行;工作原理是由于广播,v
仿佛有形状(4, 3)
,其中每行都是v的副本,然后以按元素方式进行求和。
两个数组间的广播遵循以下规则:
- 如果阵列不具有相同的秩,则对较小秩的阵列进行预处理,直到两个形状都具有相同的长度。
- 如果两个数组在某一维度的大小相等,或者其中一个数组在该维度的大小为1,则称两个数组在这个维度上兼容。
- 如果两个数组在所有维度上都兼容,则可以进行广播。
- 广播后,每个数组形状等同于较大的数组形状。
- 如果在某一维度,其中一个数组大小等于1并且另一个数组大小大于1,则前者沿着此维度复制自身。
支持广播的函数被称为通用函数。你可以在 这份文档 中找到所有通用函数的列表。 以下是广播的一些应用:
1 | import numpy as np |
广播通常会使你的代码更加简洁快捷,因此你应尽可能地努力使用它。
NumPy文档
这个简短的概述已经涉及到大部分numpy的重要功能,但仍有许多地方未涉及。查看 numpy参考文档 以了解更多关于numpy的信息。
SciPy
NumPy提供了一个高性能的多维数组和基本的工具来计算和操纵这些数组。 SciPy建立在此基础之上,并提供了大量功能,可以运行在numpy数组上,并且可用于不同类型的科学和工程应用。
熟悉SciPy的最佳方法是浏览 这份文档 。我们将阐述SciPy的一些对神经网络有用的部分。
图像操作
SciPy提供了一些基本功能来处理图像。例如,它具有从磁盘读取图像到numpy数组,将numpy数组写入磁盘作为图像并调整图像大小的功能。下面的示例中展示了这些功能:
1 | from scipy.misc import imread, imsave, imresize |
点的距离
SciPy定义了一些有用的函数,用于计算点集合之间的距离。
函数scipy.spatial.distance.pdist
计算给定单个集合中所有点之间的距离:
1 | import numpy as np |
你可以在 这份文档 中阅读有关此功能的所有详细信息。
类似的函数(scipy.spatial.distance.cdist
)能够计算不同集合内所有点之间的距离;你可以阅读 这份文档 。
Matplotlib
Matplotlib 是一个绘图库。本节简要介绍了matplotlib.pyplot
模块,该模块提供了与MATLAB类似的绘图系统。
绘图
matplotlib中最重要的函数是plot
,它可以绘制2D数据。这是一个简单的例子:
1 | import numpy as np |
运行此代码,会生成以下图形:
只需一点额外的工作,我们可以轻松地绘制多行,并添加标题,图例和轴标签:
1 | import numpy as np |
关于plot
函数的更多信息,你可以阅读 这份文档 。
绘制子图
你可以使用subplot
函数在同一图中绘制不同子图。例如:
1 | import numpy as np |
关于subplot
函数的更多信息,你可以阅读 这份文档 。
图片
你可以使用imshow功能来显示图像。例如:
1 | import numpy as np |