深度学习与目标检测:工具、原理与算法
上QQ阅读APP看书,第一时间看更新

2.3.2 创建NumPy数组

我们可以通过创建Python列表的方式创建NumPy矩阵,比如输入nparray=np.array([i for i in range(10)])命令,可以看到返回的结果是array([0,1,2,3,4,5,6,7,8,9])。同样,我们也可以通过Python列表的方式修改值,比如输入nparray[0]=10,再观察nparray的向量就会发现,返回的结果是array([10,1,2,3,4,5,6,7,8,9])。

NumPy数组也封装了其他用于创建矩阵的方法。我们先介绍np.zeros方法(从命名规则来看,这个方法用于创建数值都为0的向量)。


a = np.zeros(10)

返回结果如下。


array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

我们发现,每一个0后面都有一个小数点,通过调用a.dtype会发现,我们创建的这个向量的类型为dtype(‘float64’)。值得注意的是,在大部分目标检测算法的开发中,我们使用的都是float64这个类型。使用以下命令可以在创建NumPy矩阵的时候强制规定一种类型。


np.zeros(10,dtype=int)

这样,返回的结果在矩阵中的数据都是整型0了。介绍完使用np.zeros方法创建向量之后,再来看如何创建一个多维矩阵。


np.zeros(shape=(3,4)) #创建一个3行4列的矩阵,数据类型为float64

返回结果如下。


array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

与np.zeros()方法相似的还有np.ones()方法。顾名思义,创建的矩阵数值都为1。我们来举个例子进行说明。


np.ones((3,4))

返回结果如下。


array([[ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.]])

读者可能会有疑问,既然我们可以创建数值全为0的矩阵,也可以创建数值全为1的矩阵,那么NumPy是否提供了一个方法可以让我们自己指定值呢?答案是肯定的,这个方法就是np.full()方法,我们来看下边的例子。


np.full((3,5),121) #创建一个3行5列的矩阵,默认值为121

返回结果如下。


array([[121, 121, 121, 121, 121],
       [121, 121, 121, 121, 121],
       [121, 121, 121, 121, 121]])

我们也可以使用np.arange()方法创建NumPy矩阵。

np.arange(0,20,2) #arange接收3个参数,与Python中的range()方法相似,arange()也是前闭后开的方法,第1个参数为向量的第一个值0,第2个参数为向量的最后一个值20,因为是后开,所以取的是18,第3个参数为步长,默认为1,本例为2,故最后一个值是18

返回结果如下。


array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])

我们可以使用np.linspace()方法(前闭后闭)对NumPy矩阵进行等分,比如我们想将0~10等分为5份,代码如下。


np.linspace(0,10,5)

返回结果如下。


array([  0.,   2.5,   5.,   7.5,  10.])

我们通过下面几个例子来看在NumPy矩阵中如何生成随机数矩阵。

生成一个长度为10的向量,里面的数值都是0~10的整数。


import numpy as np
np.random.randint(0,10,10)

如果不确定每个参数代表的意思,则加上参数名size。


np.random.randint(0,5,size=5)  #注意是前闭后开,永远取不到5

我们也可以生成一个3行5列的整数矩阵,命令如下。


np.random.randint(4,9,size=(3,5))

如果我们不想每次生成的随机数都不固定,可以执行np.random.seed(1)命令,随机种子设为1,这以后用随机种子1生成的随机数都是固定的。

我们也可以生成0~1的浮点数的向量或者矩阵。


np.random.random(10) #生成0~1的浮点数,长度为10的向量
np.random.random((2,4)) #生成0~1的浮点数,2行4列的矩阵

np.random.normal()的意思是一个正态分布,normal在这里是正态的意思。numpy.random.normal(loc=0,scale=1,size=shape)命令的意义如下。

1)参数loc(float):正态分布的均值,对应这个分布的中心。loc=0说明这是一个以Y轴为对称轴的正态分布。

2)参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越扁平,scale越小,曲线越陡峭。

3)参数size(int或者整数元组):输出的值赋在shape里,默认为None。