
1.1 把图像数字化
NumPy是Python的第三方库,若要使用它,需要先导入。

导入NumPy后,可通过输入np.+Tab键查看可使用的函数。如果你对其中一些函数的使用方法不是很清楚,还可以通过运行“对应函数+?”命令的方式,看到使用函数的帮助信息。
例如,输入np.,然后按Tab键,将出现如图1-1所示界面。
运行如下命令,可查看函数abs的详细帮助信息。

NumPy不但强大,而且非常友好。接下来我将介绍NumPy的一些常用方法,尤其是与机器学习、深度学习相关的一些内容。

图1-1 输入np.并按Tab键
前面提到,NumPy封装了一个新的多维数组对象ndarray。该对象封装了许多常用的数学运算函数,以便我们做数据处理、数据分析等。如何生成ndarray呢?这里介绍几种生成ndarray的方式,如从已有数据中生成,利用random模块生成,使用arange、Linspace函数生成等。
机器学习中的图像、自然语言、语音等在输入模型之前都需要数字化。这里我们用cv2把一个汽车图像转换为NumPy多维数组,然后查看该多维数组的基本属性,具体代码如下:


运行结果如下,效果如图1-2所示。


图1-2 把汽车图像转换为NumPy数组
1.1.1 数组属性
在NumPy中,维度被称为轴,比如我们把汽车图像转换为一个NumPy 3维数组,这个数组中有3个轴,长度分别为675、1200、3。
NumPy的ndarray对象有3个重要的属性,分析如下。
❑ndarray.ndim:数组的维度(轴的个数)。
❑ndarray.shape:数组的维度,它的值是一个整数元祖。元祖的值代表其所对应的轴的长度。比如对于2维数组,它用来表达这是几行几列的矩阵,值为(x,y),其中x代表这个数组有几行,y代表有几列。
❑ndarray.dtype:描述数组中元素的类型。
比如上面提到的img数组:

为更好地理解ndarray对象的3个重要属性,我们对1维数组、2维数组、3维数组进行可视化,如图1-3所示。
1.1.2 从已有数据中生成数组
直接对Python的基础数据类型(如列表、元组等)进行转换来生成数组。
1)将列表转换成数组。


图1-3 多维数组的可视化表示

2)将嵌套列表转换成多维数组。

如果把上面示例中的列表换成元组,上述的转换方法也同样适用。
1.1.3 利用random模块生成数组
在深度学习中,我们经常需要对一些参数进行初始化。为了更有效地训练模型,提高模型的性能,有些初始化还需要满足一定条件,如满足正态分布或均匀分布等。这里我们先来看看np.random模块常用函数,如表1-1所示。
表1-1 np.random模块常用函数

下面我们来看看一些函数的具体使用方法:

运行结果如下:

用以上方法生成的随机数是无法重现的,比如调用两次np.random.randn(3, 3),输出同样结果的概率极低。如果我们想要多次生成同一份数据,应该怎么办呢?可以使用np.random.seed函数设置种子。设置一个种子,然后调用随机函数产生一个数组,如果想要再次得到一个一模一样的数组,只要再次设置同样的种子就可以。

运行结果如下:

1.1.4 利用arange、linspace函数生成数组
有时,我们希望用到具有特定规律的一组数据,这时可以使用NumPy提供的arange、linspace函数来生成数组。
arange是numpy模块中的函数,其格式为:

其中start与stop用于指定范围,step用于设定步长,生成1个ndarray。start默认为0,step可为小数。Python的内置函数range的功能与此类似。

linspace也是numpy模块中常用的函数,其格式为:

它可以根据输入的指定数据范围以及等份数量,自动生成一个线性等分向量,其中endpoint(包含终点)默认为True,等分数量num默认为50。如果将retstep设置为True,则会返回一个带步长的数组。

值得一提的是,这里并没有像我们预期的那样生成0.1, 0.2, …, 1.0这样步长为0.1的数组,这是因为linspace必定会包含数据起点和终点,那么其步长为(1-0)/9=0.11111111。如果需要产生0.1, 0.2,…, 1.0这样的数据,只需要将数据起点0修改为0.1即可。
除了上面介绍的arange和linspace函数,NumPy还提供了logspace函数,该函数的使用方法与linspace的使用方法一样,读者不妨自己动手试一下。