![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=1739311178-lkKWLgSmVDLKSM1bgvTIfNrHClPXTldn-0-29a1909b1f30f53310b0681e68cef376)
下面我们来看一些示例。
1. reshape
使用reshape函数修改向量维度。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/28_01.jpg?sign=1739311178-kDPUW530JkoxUqIQAKMzEeK9aTSmY3fy-0-7b42b5eec4fcdb1f25374449cd22fa15)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/28_02.jpg?sign=1739311178-qgMx5r97PwT93mL8AwWgDwwu5vT7yv0l-0-02f3d13b61ac67646028106f2a332f4d)
值得注意的是,reshape函数支持只指定行数(或列数),其他值设置为-1即可。不过所指定的行数或列数一定要能被整除,例如,将上面的代码修改为arr.reshape(3,-1)时将报错(10不能被3整除)。
2. resize
使用resize函数修改向量维度。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/28_03.jpg?sign=1739311178-R590UDEtzoZcqGU3pXrX7PH23IFlykzU-0-f31406f64f06d41685f12992cf92a1a4)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/28_04.jpg?sign=1739311178-aDCsBOwme2fmyqeukusPc7RzVgyABMVv-0-651bc9b24dc584e8b41b301f1571b4a7)
3. .T
使用.T函数对向量进行转置。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/28_05.jpg?sign=1739311178-OoSKriEtxAmZYcOn3OPSVFjJTQcx8tzA-0-91121ee3a1db362a195bb3c850368ca7)
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/29_01.jpg?sign=1739311178-xMUx8sEOLTi35rycP1xcfnssy3PKBP6f-0-77acbe781c9ad469ec51af0ced3ef40d)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/29_02.jpg?sign=1739311178-ZbzTdN2pLI9YV7WJdYxvfJGNo9tiP3Ym-0-0bd647777b1547a25074104ff9d97212)
4. ravel
ravel函数接收一个根据C语言格式(即按行优先排序)或者Fortran语言格式(即按列优先排序)来进行展平的参数,默认为按行优先排序。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/29_03.jpg?sign=1739311178-IUcFV5AFAxxIHxOodgT1gH7L7UDfk1kt-0-9ffc9988ed40e1e25a1394bade139709)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/29_04.jpg?sign=1739311178-aB8cWeRtz0mNBUlavvKEge9CnjNGYF6F-0-49a604ad924fb9aadc573bd1fa96077c)
5. flatten(order='C')
把矩阵转换为向量,展平方式默认是按行优先排序(即参数order='C'),这种需求经常出现在卷积神经网络与全连接层之间。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/29_05.jpg?sign=1739311178-oF2oNQPhqhob9wLzhicNUQZIBH7kjXCA-0-28d8d894f27994b60cfbf6ed901e67eb)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/29_06.jpg?sign=1739311178-fiZPDafOEF1p22OpSWPCdkUtcaPDfVw6-0-c628e81d2a6f5becf3451ccb7c89743c)
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/30_01.jpg?sign=1739311178-f9wjloPR0wYsO20P8opDOirYUrtUyljU-0-c2aa7da69c468141f4c3fcf5c936e1a7)
flatten函数经常用于神经网络中,一般我们在把2维、3维等数组转换为1维数组时会用到flatten,如图1-8所示。
6. squeeze
这是一个主要用来降维的函数,可以把矩阵中含1的维度去掉。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/30_02.jpg?sign=1739311178-jlvfIAdZG5UJSk29Pc3fKn7wUC80trbR-0-2a2cb0fa9385f06c6b863e87cbec8086)
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/30_03.jpg?sign=1739311178-k1cWTB9taszcJx9zMyzSiaY47nK94vjt-0-98aba4c019c5005e1224a6034ddd4aef)
图1-8 含flatten运算的神经网络示意图
7. transpose
对高维矩阵进行轴对换,多用于深度学习中,比如把表示图像颜色的RGB顺序改为GBR。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/30_04.jpg?sign=1739311178-DvtiUHWC05GatOQrBf6fmamMH8G6tjBk-0-4008d211326e483c09b397e214891802)
1.4.2 合并数组
合并数组也是最常见的操作之一,表1-3列举了几种常用的NumPy数组合并方法。
表1-3 NumPy数组合并方法
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/30_05.jpg?sign=1739311178-smvVRN0dGQZNR9nCgmEVOgLaoyp4VDJ3-0-58af35a1fab160c92088cc39d8ba2cf9)
说明
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=1739311178-YO5IGiRvXL3vNKFgfNDAP5P537ilqwUj-0-d1bb93c71f0e3ad2fa69822d51acc361)
合并多维数组:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/31_02.jpg?sign=1739311178-Q5iOC8He5NE4CKZywiaLEVQYV26B02w2-0-92a5e409b29de37c49e0c27f4a49b5a3)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/31_03.jpg?sign=1739311178-zgaAqsXla0eq3zJ3An9erBO96YIW6Og3-0-291ca5ed3fe386c10e6170ad747b5117)
2. concatenate
沿指定轴连接数组或矩阵:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/32_01.jpg?sign=1739311178-WiiVDYflDT0Cif2uzeh1PGmPxKuVumqu-0-477f915eb7cd21e2a2f5022036620a8c)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/32_02.jpg?sign=1739311178-yLYSOiKQZMKQvL4nY9bSQ6ZIi9SyLYUA-0-041c4e6fc54a4194c684e9e80294011a)
3. stack
沿指定轴堆叠数组或矩阵:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/32_03.jpg?sign=1739311178-P2mKRCCbIXk2S6GV8p9pcg0eR6fefX2T-0-348006a0f3e220b307f38429c50732f4)
输出结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/32_04.jpg?sign=1739311178-kDXDnQGdnDewWY3Wvy0VZHIr19xADrNe-0-bc91f61d281213d8891e7474ace2f018)
4. zip
zip是Python的一个内置函数,多用于张量运算中。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/32_05.jpg?sign=1739311178-LaUFwR84gz5SrYCgujAPUWHFREnXl2RV-0-7e91076a5bf860479b2eda735dd00c2c)
运行结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/33_01.jpg?sign=1739311178-hnF91GXNcWdpEkWRovcOI1plLFg5uxWF-0-d0cd1f00db1aace58e160e8e6f36d61f)
再来看一个示例:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/33_02.jpg?sign=1739311178-05JMvP6Sj1NJyIZGRsrdq9qvaPQ0a25w-0-18a3892c5c71ec907c04ee679cab0b7e)
运行结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/33_03.jpg?sign=1739311178-TqtcZQi1A3ShJQXvpuJNcLIm3f0icoMw-0-f6b2450b705a43184ab1434f295c282a)