![Python深度学习:基于TensorFlow(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/658/48593658/b_48593658.jpg)
1.4 数据变形
在机器学习以及深度学习的任务中,我们通常需要将处理好的数据以模型能接收的格式发送给模型,然后由模型通过一系列运算,最终返回一个处理结果。然而,由于不同模型所接收的输入格式不一样,我们往往需要先对其进行一系列变形和运算,从而将数据处理成符合模型要求的格式。最常见的是矩阵或者数组的运算,如我们经常会需要把多个向量或矩阵按某轴方向合并或展平(如在卷积或循环神经网络中,在全连接层之前,我们需要把矩阵展平)。下面介绍几种常用的数据变形方法。
1.4.1 更改数组的形状
修改指定数组的形状是NumPy中最常见的操作之一,表1-2列出了NumPy中改变向量形状的一些常用函数。
表1-2 NumPy中改变向量形状的一些常用函数
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/27_02.jpg?sign=1738883555-vkceGzG6sYbDulzhi8Ub0HPJ6UMmaQGF-0-0c9a0a99389f9845b6dc5a22d0085c39)
下面我们来看一些示例。
1. reshape
使用reshape函数修改向量维度。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/28_01.jpg?sign=1738883555-ulER0fiLT5y0vgSs9u51158p9l0ossWQ-0-b69a1b220dbb17f4d7c920167a3cbf6a)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/28_02.jpg?sign=1738883555-10KAbJtyS2ZcJn56ji5KNWscLyYYehup-0-6fd8f6f4ec28b18c5179d3c1b2e1a38e)
值得注意的是,reshape函数支持只指定行数(或列数),其他值设置为-1即可。不过所指定的行数或列数一定要能被整除,例如,将上面的代码修改为arr.reshape(3,-1)时将报错(10不能被3整除)。
2. resize
使用resize函数修改向量维度。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/28_03.jpg?sign=1738883555-3DHXEWn6f149VTDRsBJXFOFqTRqnnJNM-0-d9b6ab6c6903ce3f1324719a75d828a8)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/28_04.jpg?sign=1738883555-lanz1HgCPteHNV9w9kZWshJvDLEi09Ng-0-4a83339b4359252320f1e9946ea28f51)
3. .T
使用.T函数对向量进行转置。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/28_05.jpg?sign=1738883555-IGSaprD3jOXpiHz0NaML7SdXEW1oCzH1-0-f81aabb704847d10593633257bbd760e)
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/29_01.jpg?sign=1738883555-SpYwl9uSYWMdZBOWp6gO5XqAwbm1lcGp-0-edf4f82753db9e864faa12bf8e96a0f1)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/29_02.jpg?sign=1738883555-aSJB5mjLKmNWtqf947XelM6ubO7ZDeTW-0-3d9915de827a8494c2c24a0b6791d160)
4. ravel
ravel函数接收一个根据C语言格式(即按行优先排序)或者Fortran语言格式(即按列优先排序)来进行展平的参数,默认为按行优先排序。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/29_03.jpg?sign=1738883555-C1lAXVulYLnYgLiZLY00ITCSJBIXsbC5-0-2fc5b33d4e4cdfc9541fd61f54c59274)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/29_04.jpg?sign=1738883555-0w9ozmF4hDSdKkdUlnDc7GzTOhvTPvN5-0-bfdebcd09d803757617faf75d9d0e1fc)
5. flatten(order='C')
把矩阵转换为向量,展平方式默认是按行优先排序(即参数order='C'),这种需求经常出现在卷积神经网络与全连接层之间。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/29_05.jpg?sign=1738883555-Q3HjJSQutrXvTMdB5SigbnEbH1U1jcv2-0-25b755e78818b1d405efb10c5a656bfa)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/29_06.jpg?sign=1738883555-1plE2F7i8rXmuTk2YE4CQsCkcmKH2gFg-0-f0931142420f2b87ca7f8c0d7bf86691)
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/30_01.jpg?sign=1738883555-3YtZMOnXoH2TsIp8bb4BKvkWM5lUQPLL-0-29349500a2bbd0c555cbd4773aa4ef89)
flatten函数经常用于神经网络中,一般我们在把2维、3维等数组转换为1维数组时会用到flatten,如图1-8所示。
6. squeeze
这是一个主要用来降维的函数,可以把矩阵中含1的维度去掉。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/30_02.jpg?sign=1738883555-A7H9VvYAwd5uBrDbSc5Eg3m8FbLSQtmT-0-46d8734a32103950430a95d7f1b49dbb)
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/30_03.jpg?sign=1738883555-i1bbpep0mfWcFRorxWLlHLP1KqrYVKVl-0-0559ef5596133bd3322ba0790e4f7543)
图1-8 含flatten运算的神经网络示意图
7. transpose
对高维矩阵进行轴对换,多用于深度学习中,比如把表示图像颜色的RGB顺序改为GBR。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/30_04.jpg?sign=1738883555-An09rPq5UFgNfMdtOyYzLLasvvyMIchf-0-2a1381c8fd0538e6592b6706abdb8e4a)
1.4.2 合并数组
合并数组也是最常见的操作之一,表1-3列举了几种常用的NumPy数组合并方法。
表1-3 NumPy数组合并方法
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/30_05.jpg?sign=1738883555-11fzGYcf289Q1voE9WCpZ8BwEqJpRAHe-0-d827318e69558f690bab4f4417ce1767)
说明
1)append、concatenate以及stack函数都有一个axis参数,用于控制数组合并是按行还是按列优先排序。
2)对于append和concatenate函数,待合并的数组必须有相同的行数或列数(满足一个即可)。
3)对于stack、hstack、dstack函数,待合并的数组必须具有相同的形状(shape)。
下面从表1-3中选择一些常用函数进行说明。
1. append
合并一维数组:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/31_01.jpg?sign=1738883555-W9xQC9Ns5EAFnQ2X4KMxnpGEOSvLVIGm-0-e20cd2c03b19f8ca2cb5529daacc752a)
合并多维数组:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/31_02.jpg?sign=1738883555-Fj0SbaV7k1JbkOrR3o1WrxnkhZdvCKVW-0-8e4c7f859d94d56aa6e2f006997a02f9)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/31_03.jpg?sign=1738883555-99Isj0KOY4hKvbNZRcvuvbC5rdZE7hWW-0-84b393960b85bdb1a8bbba151539e980)
2. concatenate
沿指定轴连接数组或矩阵:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/32_01.jpg?sign=1738883555-Mv3LBByAuQIfbQi3eMywFcuji8HaQxz1-0-f198427de8e8a5320c219f4cbe4c98b9)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/32_02.jpg?sign=1738883555-3T1wpkbnEg1nN5y3F8YJM6JytWnFpp6i-0-ef189eb6fd3667d5d06cd6ebde559573)
3. stack
沿指定轴堆叠数组或矩阵:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/32_03.jpg?sign=1738883555-oL5Mrt9d4b2DvmHxB47GXfxJBhtEZhMV-0-29379daf30a60b62f25e57e9b11b6042)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/32_04.jpg?sign=1738883555-oME3K73qalhD9bY8IXWpoINMpYe6f6LL-0-38d08ecd82a9011fd3fd43467f32bcfe)
4. zip
zip是Python的一个内置函数,多用于张量运算中。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/32_05.jpg?sign=1738883555-PwtJxmApQ1xIMeNDHyLFPgkep20a9y8k-0-7f0d2ecebf924ade33b0968903233700)
运行结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/33_01.jpg?sign=1738883555-9H6LHOccSmRz1Uc9of1OShy7QDgzy8qY-0-1ffd1d09f7a53b01ce871cbd6b1cd86b)
再来看一个示例:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/33_02.jpg?sign=1738883555-XQa7xO3cST0UiBWZbys4qjLTO1Oy2MgX-0-a495ae1be269fad2289b0c0899e08f8e)
运行结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/33_03.jpg?sign=1738883555-OQKU0bryJhfGPEeXUViwRjlAe6ZiAMjF-0-100d7f4c2d27d26a341881f26b7bf096)