《深度学习与图像识别:原理与实践》—2.3.2 创建Numpy数组

举报
华章计算机 发表于 2019/07/24 20:08:26 2019/07/24
【摘要】 本节书摘来自华章计算机《深度学习与图像识别:原理与实践》一书中的第2章,第2.3.2节,作者是魏溪含 涂铭 张修鹏。

2.3.2 创建Numpy数组

我们可以通过创建Python列表(list)的方式来创建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了。介绍完使用zeros方法创建向量之后,再来看看如何创建一个多维矩阵。我们可以使用传入元组的方式,代码如下:

np.zeros(shape=(3,4)) #代表创建的是三行四列的矩阵并且其数据类型为float64

返回的结果为:

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

       [ 0.,  0.,  0.,  0.],

       [ 0.,  0.,  0.,  0.]])

与np.zeros方法相似的还有np.ones方法,顾名思义,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) #这个方法的意思是我们创建了一个三行五列的矩阵,默认值为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接收三个参数,与Python中的range方法相似,arange也是前闭后开的方法,第一个参数为向量的第一个值0,第二个参数为最后一个值20,因为是后开所以取的是18,第三个参数为步长,默认为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矩阵中如何生成随机数矩阵。

1)生成一个长度为10的向量,里面每一个数值都是介于0~10之间的整数,代码如下:

import numpy as np

np.random.randint(0,10,10)

2)如果不确定每个参数代表的意思,则加上参数名size,代码如下:

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

3)我们也可以生成一个三行五列的整数矩阵,代码如下

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

4)seed的作用:如果不希望每次生成的随机数都不固定,那么我们可以使用np.random.seed(1),随机种子使用数字1记录,这以后只要是用随机种子1生成的随机数就都是固定的。

5)我们也可以生成介于0~1之间的浮点数的向量或者矩阵,代码如下:

np.random.random(10)       #生成0~1之间的浮点数,向量的长度为10

np.random.random((2,4))           #生成0~1之间的浮点数,二行四列的矩阵

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

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

  • 参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦。

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


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。