![Python深度学习:基于TensorFlow(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/658/48593658/b_48593658.jpg)
1.1 把图像数字化
NumPy是Python的第三方库,若要使用它,需要先导入。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/18_01.jpg?sign=1739597029-cnu0vT3IIETt54Pt9YBq6IXZVqNMFptE-0-a4debaedbdd4b9b52f1a4e7f6ea3958a)
导入NumPy后,可通过输入np.+Tab键查看可使用的函数。如果你对其中一些函数的使用方法不是很清楚,还可以通过运行“对应函数+?”命令的方式,看到使用函数的帮助信息。
例如,输入np.,然后按Tab键,将出现如图1-1所示界面。
运行如下命令,可查看函数abs的详细帮助信息。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/18_02.jpg?sign=1739597029-dU0fd7CdjZuVWHBIwtteEzdSr3HxDDVS-0-a89565c4c3031ce24a4d8e6a82e51caa)
NumPy不但强大,而且非常友好。接下来我将介绍NumPy的一些常用方法,尤其是与机器学习、深度学习相关的一些内容。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/18_03.jpg?sign=1739597029-cv6HIVrtt7PDZYTgdNZhD5Y1zfOX1Fvx-0-c02d10c4912969d69c9762bc5f2b4af6)
图1-1 输入np.并按Tab键
前面提到,NumPy封装了一个新的多维数组对象ndarray。该对象封装了许多常用的数学运算函数,以便我们做数据处理、数据分析等。如何生成ndarray呢?这里介绍几种生成ndarray的方式,如从已有数据中生成,利用random模块生成,使用arange、Linspace函数生成等。
机器学习中的图像、自然语言、语音等在输入模型之前都需要数字化。这里我们用cv2把一个汽车图像转换为NumPy多维数组,然后查看该多维数组的基本属性,具体代码如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/18_04.jpg?sign=1739597029-eO3bbnOOLPcz7wmaoNCB5LsWt8KNolsm-0-8015bfc2ead8e06b15507a74c54ff2c2)
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/19_01.jpg?sign=1739597029-c3uUicJVGrZeh7Km4tPacOyvKvU9f31K-0-c4cc1d81dc58f2e4895187f6556a5b97)
运行结果如下,效果如图1-2所示。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/19_02.jpg?sign=1739597029-w195TzZOFys3Fx78yw9SuUtpc9ySg4kz-0-c1ce63a02fad47575634b1a807e5644d)
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/19_03.jpg?sign=1739597029-EQHCJwv5VW6V4LlE3lYlE9KtXqLvOgIM-0-67c1dd5f7de673d87f8b4bcdc7d52113)
图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数组:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/19_04.jpg?sign=1739597029-GtaXMrHzsqcLRpDHuBkMhi6sSHaBW6Tf-0-ac9cab83e9806b6386d77036b1d427a1)
为更好地理解ndarray对象的3个重要属性,我们对1维数组、2维数组、3维数组进行可视化,如图1-3所示。
1.1.2 从已有数据中生成数组
直接对Python的基础数据类型(如列表、元组等)进行转换来生成数组。
1)将列表转换成数组。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/19_05.jpg?sign=1739597029-AE2l4ZVYszExSemC1Is04IVwoQIJ2fiT-0-cbbfc7335bfa16d2f6c5cee51e0d5413)
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/20_01.jpg?sign=1739597029-oQUgqsO4zezPgtEumI7JeLTflqBS91kT-0-ca7859459a05b92ca8ab694fa4ad84cb)
图1-3 多维数组的可视化表示
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/20_02.jpg?sign=1739597029-pALVRDTw9ylTPnB5WaLIX880j0GOoGGK-0-3bdae53e19dff482564911b81590f19a)
2)将嵌套列表转换成多维数组。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/20_03.jpg?sign=1739597029-fRbmeEDFdXa23cD6kQPDujM0exCFXMts-0-f8144c6cde79c6448a585ec4a52aa821)
如果把上面示例中的列表换成元组,上述的转换方法也同样适用。
1.1.3 利用random模块生成数组
在深度学习中,我们经常需要对一些参数进行初始化。为了更有效地训练模型,提高模型的性能,有些初始化还需要满足一定条件,如满足正态分布或均匀分布等。这里我们先来看看np.random模块常用函数,如表1-1所示。
表1-1 np.random模块常用函数
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/21_01.jpg?sign=1739597029-5jjNDEJSDDNUVAGxbjF7jlIpQ2w5la3s-0-30ab1c6eec28437b8bcdbd6e68a3711e)
下面我们来看看一些函数的具体使用方法:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/21_02.jpg?sign=1739597029-mhq8MC9xl5G7dDf3arGOA4kvXbMysCjs-0-ae13fd5f175fe19d9786c0514fe8d674)
运行结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/21_03.jpg?sign=1739597029-nGnuRr1zBQTowbTMKT6i2c8NGx4ZA6kO-0-a0caf75c9626fd55765140aa414e62d6)
用以上方法生成的随机数是无法重现的,比如调用两次np.random.randn(3, 3),输出同样结果的概率极低。如果我们想要多次生成同一份数据,应该怎么办呢?可以使用np.random.seed函数设置种子。设置一个种子,然后调用随机函数产生一个数组,如果想要再次得到一个一模一样的数组,只要再次设置同样的种子就可以。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/22_01.jpg?sign=1739597029-yPgLlnSJGTO6701ahOnr80tQIO07qvfy-0-13b3a26f529623dbeb12df32dbc05299)
运行结果如下:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/22_02.jpg?sign=1739597029-3ESdJip1kb5eRnNRInQklKOEZ2GbxM5M-0-4dc575b2659af558873998301c2e219c)
1.1.4 利用arange、linspace函数生成数组
有时,我们希望用到具有特定规律的一组数据,这时可以使用NumPy提供的arange、linspace函数来生成数组。
arange是numpy模块中的函数,其格式为:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/22_03.jpg?sign=1739597029-4VC5n62Ua160z1nhqZolBt5V39q4vG9c-0-137f67b6cbbff1722a19a7742ec4a456)
其中start与stop用于指定范围,step用于设定步长,生成1个ndarray。start默认为0,step可为小数。Python的内置函数range的功能与此类似。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/22_04.jpg?sign=1739597029-vPnnMxu21kO7xwbN9fx5erTnNRwr1uDC-0-061094f6b0654ee4d618788836bd21e7)
linspace也是numpy模块中常用的函数,其格式为:
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/22_05.jpg?sign=1739597029-OwqFFPFmTrSJ5xb35166FIpNyM3Z0pbi-0-c0fd4449ae08a272998b439ac1ed4ddc)
它可以根据输入的指定数据范围以及等份数量,自动生成一个线性等分向量,其中endpoint(包含终点)默认为True,等分数量num默认为50。如果将retstep设置为True,则会返回一个带步长的数组。
![](https://epubservercos.yuewen.com/AE244A/28235093307371206/epubprivate/OEBPS/Images/23_01.jpg?sign=1739597029-mFbYMfuSDUSTL4n2E0CmSa4XWZGTBlIx-0-1bebc535ce1f3025ece5ad58bdf38157)
值得一提的是,这里并没有像我们预期的那样生成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的使用方法一样,读者不妨自己动手试一下。