【深度学习初探】Day 02 - 前置库的引入

【深度学习初探】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()

输出:
在这里插入图片描述
读入图片时,要注意路径’…/'表示当前目录,不写表示同目录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值