1.4 数据变形

在机器学习以及深度学习的任务中,我们通常需要将处理好的数据以模型能接收的格式发送给模型,然后由模型通过一系列运算,最终返回一个处理结果。然而,由于不同模型所接收的输入格式不一样,我们往往需要先对其进行一系列变形和运算,从而将数据处理成符合模型要求的格式。最常见的是矩阵或者数组的运算,如我们经常会需要把多个向量或矩阵按某轴方向合并或展平(如在卷积或循环神经网络中,在全连接层之前,我们需要把矩阵展平)。下面介绍几种常用的数据变形方法。

1.4.1 更改数组的形状

修改指定数组的形状是NumPy中最常见的操作之一,表1-2列出了NumPy中改变向量形状的一些常用函数。

表1-2 NumPy中改变向量形状的一些常用函数

下面我们来看一些示例。

1. reshape

使用reshape函数修改向量维度。

输出结果如下:

值得注意的是,reshape函数支持只指定行数(或列数),其他值设置为-1即可。不过所指定的行数或列数一定要能被整除,例如,将上面的代码修改为arr.reshape(3,-1)时将报错(10不能被3整除)。

2. resize

使用resize函数修改向量维度。

输出结果如下:

3. .T

使用.T函数对向量进行转置。

输出结果如下:

4. ravel

ravel函数接收一个根据C语言格式(即按行优先排序)或者Fortran语言格式(即按列优先排序)来进行展平的参数,默认为按行优先排序。

输出结果如下:

5. flatten(order='C')

把矩阵转换为向量,展平方式默认是按行优先排序(即参数order='C'),这种需求经常出现在卷积神经网络与全连接层之间。

输出结果如下:

flatten函数经常用于神经网络中,一般我们在把2维、3维等数组转换为1维数组时会用到flatten,如图1-8所示。

6. squeeze

这是一个主要用来降维的函数,可以把矩阵中含1的维度去掉。

图1-8 含flatten运算的神经网络示意图

7. transpose

对高维矩阵进行轴对换,多用于深度学习中,比如把表示图像颜色的RGB顺序改为GBR。

1.4.2 合并数组

合并数组也是最常见的操作之一,表1-3列举了几种常用的NumPy数组合并方法。

表1-3 NumPy数组合并方法

说明

1)append、concatenate以及stack函数都有一个axis参数,用于控制数组合并是按行还是按列优先排序。

2)对于append和concatenate函数,待合并的数组必须有相同的行数或列数(满足一个即可)。

3)对于stack、hstack、dstack函数,待合并的数组必须具有相同的形状(shape)。

下面从表1-3中选择一些常用函数进行说明。

1. append

合并一维数组:

合并多维数组:

输出结果如下:

2. concatenate

沿指定轴连接数组或矩阵:

输出结果如下:

3. stack

沿指定轴堆叠数组或矩阵:

输出结果如下:

4. zip

zip是Python的一个内置函数,多用于张量运算中。

运行结果如下:

再来看一个示例:

运行结果如下: