Python深度学习:基于PyTorch
上QQ阅读APP看书,第一时间看更新

1.1 生成Numpy数组

Numpy是Python的外部库,不在标准库中。因此,若要使用它,需要先导入Numpy。

import numpy as np

导入Numpy后,可通过np.+Tab键,查看可使用的函数,如果对其中一些函数的使用不是很清楚,还可以在对应函数+?,再运行,就可以很方便地看到如何使用函数的帮助信息。

输入np.然后按Tab键,将出现如下界面:

运行如下命令,便可查看函数abs的详细帮助信息。

np.abs?

Numpy不但强大,而且还非常友好。下面将介绍Numpy的一些常用方法,尤其是与机器学习、深度学习相关的一些内容。

Numpy封装了一个新的数据类型ndarray(N-dimensional Array),它是一个多维数组对象。该对象封装了许多常用的数学运算函数,方便我们做数据处理、数据分析等。那么如何生成ndarray呢?这里介绍生成ndarray的几种方式,如从已有数据中创建,利用random创建,创建特定形状的多维数组,利用arange、linspace函数生成等。

1.1.1 从已有数据中创建数组

直接对Python的基础数据类型(如列表、元组等)进行转换来生成ndarray:

1)将列表转换成ndarray:

import numpy as np
lst1 = [3.14, 2.17, 0, 1, 2]
nd1 =np.array(lst1)
print(nd1)
# [3.14 2.17 0.   1.   2.  ]
print(type(nd1))
# <class 'numpy.ndarray'>

2)嵌套列表可以转换成多维ndarray:

import numpy as np
lst2 = [[3.14, 2.17, 0, 1, 2], [1, 2, 3, 4, 5]]
nd2 =np.array(lst2)
print(nd2)
# [[3.14 2.17 0.   1.   2.  ]
#  [1.   2.   3.   4.   5.  ]]
print(type(nd2))
# <class 'numpy.ndarray'>

如果把上面示例中的列表换成元组也同样适用。

1.1.2 利用random模块生成数组

在深度学习中,我们经常需要对一些参数进行初始化,因此为了更有效地训练模型,提高模型的性能,有些初始化还需要满足一定的条件,如满足正态分布或均匀分布等。这里介绍了几种常用的方法,如表1-1所示列举了np.random模块常用的函数。

表1-1 np.random模块常用函数

下面来看一些函数的具体使用:

import numpy as np
nd3 =np.random.random([3, 3])
print(nd3)
# [[0.43007219 0.87135582 0.45327073]
#  [0.7929617  0.06584697 0.82896613]
#  [0.62518386 0.70709239 0.75959122]]
print("nd3的形状为:",nd3.shape)
# nd3的形状为: (3, 3)

为了每次生成同一份数据,可以指定一个随机种子,使用shuffle函数打乱生成的随机数。

import numpy as np
np.random.seed(123)
nd4 = np.random.randn(2,3)
print(nd4)
np.random.shuffle(nd4)
print("随机打乱后数据:")
print(nd4)
print(type(nd4))

输出结果:

[[-1.0856306   0.99734545  0.2829785 ]
 [-1.50629471 -0.57860025  1.65143654]]

随机打乱后数据:

[[-1.50629471 -0.57860025  1.65143654]
 [-1.0856306   0.99734545  0.2829785 ]]

1.1.3 创建特定形状的多维数组

参数初始化时,有时需要生成一些特殊矩阵,如全是0或1的数组或矩阵,这时我们可以利用np.zeros、np.ones、np.diag来实现,如表1-2所示。

表1-2 Numpy数组创建函数

下面通过几个示例说明:

import numpy as np
# 生成全是 0 的 3x3 矩阵
nd5 =np.zeros([3, 3])
#生成与nd5形状一样的全0矩阵
#np.zeros_like(nd5)
# 生成全是 1 的 3x3 矩阵
nd6 = np.ones([3, 3])
# 生成 3 阶的单位矩阵
nd7 = np.eye(3)
# 生成 3 阶对角矩阵
nd8 = np.diag([1, 2, 3])
print(nd5)
# [[0. 0. 0.]
#  [0. 0. 0.]
#  [0. 0. 0.]]
print(nd6)
# [[1. 1. 1.]
#  [1. 1. 1.]
#  [1. 1. 1.]]
print(nd7)
# [[1. 0. 0.]
#  [0. 1. 0.]
#  [0. 0. 1.]]
print(nd8)
# [[1 0 0]
#  [0 2 0]
#  [0 0 3]]

有时还可能需要把生成的数据暂时保存起来,以备后续使用。

import numpy as np
nd9 =np.random.random([5, 5])
np.savetxt(X=nd9, fname='./test1.txt')
nd10 = np.loadtxt('./test1.txt')
print(nd10)

输出结果:

[[0.41092437 0.5796943  0.13995076 0.40101756 0.62731701]
 [0.32415089 0.24475928 0.69475518 0.5939024  0.63179202]
 [0.44025718 0.08372648 0.71233018 0.42786349 0.2977805 ]
 [0.49208478 0.74029639 0.35772892 0.41720995 0.65472131]
 [0.37380143 0.23451288 0.98799529 0.76599595 0.77700444]]

1.1.4 利用arange、linspace函数生成数组

arange是numpy模块中的函数,其格式为:

arange([start,] stop[,step,], dtype=None)

其中start与stop用来指定范围,step用来设定步长。在生成一个ndarray时,start默认为0,步长step可为小数。Python有个内置函数range,其功能与此类似。

import numpy as np
print(np.arange(10))
# [0 1 2 3 4 5 6 7 8 9]
print(np.arange(0, 10))
# [0 1 2 3 4 5 6 7 8 9]
print(np.arange(1, 4, 0.5))
# [1.  1.5 2.  2.5 3.  3.5]
print(np.arange(9, -1, -1))
# [9 8 7 6 5 4 3 2 1 0]

linspace也是numpy模块中常用的函数,其格式为:

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

linspace可以根据输入的指定数据范围以及等份数量,自动生成一个线性等分向量,其中endpoint(包含终点)默认为True,等分数量num默认为50。如果将retstep设置为True,则会返回一个带步长的ndarray。

import numpy as np
print(np.linspace(0, 1, 10))
#[0.         0.11111111 0.22222222 0.33333333 0.44444444 0.55555556
# 0.66666667 0.77777778 0.88888889 1.        ]

值得一提的是,这里并没有像我们预期的那样,生成0.1,0.2,...,1.0这样步长为0.1的ndarray,这是因为linspace必定会包含数据起点和终点,那么其步长则为(1-0)/9=0.11111111。如果需要产生0.1,0.2,...,1.0这样的数据,只需要将数据起点0修改为0.1即可。

除了上面介绍到的arange和linspace,Numpy还提供了logspace函数,该函数的使用方法与linspace的使用方法一样,读者不妨自己动手试一下。