【深度学习初探】02 - 前置库的引入
文章目录
一、NumPy
在深度学习的实现中,经常出现数组和矩阵的计算。NumPy的数组类(numpy.array)中提供了很多便捷的方法,在实现深度学习时,我们将使用这些方法。
1.1 导入NumPy
NumPy是外部库,即不是Python自带的库。因此我们用:
>>> import numpy as np
来导入,一般命名统一为np。
1.2 生成NumPy数组
要生成NumPy数组,需要使用np.array( )方法。np.array( )接收 Python列表 作为参数,生成NumPy数组(numpy.ndarray类型)。
>>> x = np.array([1.0, 2.0, 3.0])
>>> print(x)
[ 1. 2. 3. ]
>>> type(x)
<class 'numpy.ndarray'>
可以看到np的数组是numpy.ndarray类型。
1.3 NumPy的算术运算
下面是NumPy数组的算术运算的例子。
>>> x = np.array([1.0, 2.0, 3.0])
>>> y = np.array([2.0, 4.0, 6.0])
>>> x + y # 对应元素的加法
array([ 3., 6., 9.])
>>> x - y # 对应元素的减法
array([ -1., -2., -3.])
>>> x * y # 对应元素的乘法
array([ 2., 8., 18.])
>>> x / y # 对应元素的除法
array([ 0.5, 0.5, 0.5])
这里要注意的是,数组x和数组y的元素个数是相同的(两者均为个数为3的一维数组)。当x和y的元素个数相同时,直接对该数组做加减,就是对各个元素进行算术运算。如果元素个数不同,程序就会报错。“对应元素”的英文是element-wise,NumPy不仅可以进行element-wise运算,也可以和单一的数值(标量)组合起来运算,此时是数组各个元素和标量之间进行运算。这个功能也被称为“广播”。
>>> x = np.array([1.0, 2.0, 3.0])
>>> x / 2.0
array([0.5, 1., 1.5])
1.4 NumPy的N维数组(张量)
NumPy不仅可以生成一维数组,还可以生成多维数组。比如,可以生成如下的二维数组(矩阵)。
>>> A = np.array([[1, 2], [3, 4]])
>>> print(A)
[[1 2]
[3 4]]
>>> A.shape
(2, 2)
>>> A.dtype
dtype('int64')
这里生成了一个2 × 2的矩阵A。另外,矩阵A的形状可以调用shape查看,矩阵元素的数据类型可以用dtype查看。
下面,我们再看一下矩阵的算术运算。
>>> B = np.array([[3, 0], [0, 6]])
>>> A + B
array([[4, 2], [3, 10]])
>>> A * B
array([[3, 0], [0, 24]])
和数组算术运算一样,矩阵的算术运算可在形状相同的矩阵间以对应元素的方式进行。并且,也可通过标量进行运算,也是基于广播的功能。
>>> print(A)
[[1 2]
[3 4]]
>>> A * 10
array([[10, 20],
[30, 40]])
NumPy数组(np.array)可以生成N维数组(任意维数)。数学上将一维数组称为向量,将二维数组称为矩阵。另外,可以将一般化之后的向量或矩阵等统称为张量(tenser)。我们将二维数组叫做“矩阵”,将三维及三维以上的数组称为“张量”或“多维数组”。’
1.5 广播
NumPy中的数组,如果形状不同,也可以直接进行运算。之前提到一个2 × 2矩阵A和标量10之间进行了乘法运算,在此过程中,标量10首先被扩展为2 × 2的形状,四个元素都是10,然后再与A进行乘法运算,这个功能就叫广播(Broadcast)。
假如有一个2 × 2矩阵和一个一维数组(只有两个元素)相乘,进行广播运算时就会把一维数组扩展成2 × 2矩阵。如果一维数组超过了两个元素(至少3列),那广播就无法进行了。因此广播也是有条件的,需要满足:另一个小一些的数组或矩阵能够变成大的那个数组的形状。
A = np.array([[1, 2], [3, 4]])
B = np.array([10, 20])
print(A * B)
输出:
[[10 40]
[30 80]]
计算过程就是,[10, 20] 被转换成了 [ [10, 20], [10, 20] ],然后和 [ [1, 2], [3, 4] ] 进行对应元素的乘法运算(element-wise)。
1.6 访问元素
元素的索引从0开始。对各个元素的访问可直接用下标。
X = np.array([[51, 55], [14, 19], [0, 4]])
print(X) #输出整个矩阵
print(X[0]) #访问第0行
print(X[0][1]) #访问第0行第1列
输出:
[[51 55]
[14 19]
[ 0 4]]
[51 55]
55
也可以使用for语句访问各个元素。
for row in X:
print(row)
输出:
[51 55]
[14 19]
[0 4]
除了以上的索引操作,NumPy还可以使用数组访问各个元素。只需要将原矩阵转换成一维数组即可索引。
X = np.array([[51, 55], [14, 19], [0, 4]])
X = X.flatten() # 把X转换为一维数组
print(X)
print(X[np.array([0, 2, 4])]) # 访问数组下标为0,2,4的元素
print(X[[0, 2, 4]]) # 上一行的等效写法
输出:
[51 55 14 19 0 4]
[51 14 0]
[51 14 0]
NumPy的索引操作甚至还支持逻辑语句,只要当前元素的[ ]里的值为True,就访问,否则不访问。
X = np.array([[51, 55], [14, 19], [0, 4]])
print(X > 15)
print(X[X > 15])
print(X[[[True, True],[False, True],[False, False]]]) #上一行的等效写法
输出:
[[ True True]
[False True]
[False False]]
[51 55 19]
[51 55 19]
如上所示,X > 15 这个语句也是有返回值的,返回的是一个bool类型的数组,它会将每个元素进行逻辑语句判断得到True或False的结果,填充到相应位置上。而 X [ True ] 则会访问该位置的元素。
二、Matplotlib
Matplotlib是用于绘制图形的库,使用Matplotlib可以轻松地绘制图形和实现数据的可视化。
2.1 绘制简单图形
可以使用matplotlib的pyplot模块绘制图形。下面,我们绘制一个sin函数曲线。
# 生成数据
x = np.arange(0, 6, 0.1) # 以0.1为单位,生成从0到6的数据
y = np.sin(x)
# 绘制图形
plt.plot(x, y)
plt.show()
输出:
我们使用NumPy的arange方法生成了[0, 0.1, 0.2, ……, 5.8, 5.9]的数据,将其设为x。对x的各个元素,应用NumPy的sin函数np.sin()求出所有x对应的sin(x)传给y,将x、y的数据传给plt.plot方法,由它绘制图形。
2.2 pyplot的其他功能
在刚才的sin函数的图形中,我们可以尝试追加绘制一条cos函数曲线,尝试使用pyplot的添加标题和x轴标签名等其他功能。
# 生成数据
x = np.arange(0, 6, 0.1) # 以0.1为单位,生成从0到6的数据
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制图形
plt.plot(x, y1, label="sin")
plt.plot(x, y2, linestyle = "--", label="cos") # 将线条改为虚线
plt.xlabel("x") # 给x轴添加标签
plt.ylabel("y") # 给y轴添加标签
plt.title('sin & cos') # 添加标题
plt.legend() # 激活函数,使得所有label相关设置生效
plt.show()
输出:
2.3 显示图像
pyplot中提供了用于显示图像的方法imshow()。可以使用matplotlib.image模块的imread()方法读入图像。
from matplotlib.image import imread
img = imread('Huge.jpg') # 读入同目录下的图像
plt.imshow(img)
plt.show()
输出:
读入图片时,要注意路径’…/'表示当前目录,不写表示同目录。