在上一篇《手把手陪您学Python》50——数组的dtype属性中,我们学习了数组的数据类型及其转换方法。
今天,我们将会利用之前学习的数组属性的相关知识,学习其他生成数组的方式。
1、reshape
array和arange是我们在《手把手陪您学Python》48——数组的生成方法1中学习的数组的生成方法。
虽然这两种方法都可以将指定序列转换为数组,但在转换的过程中,array是根据列表的长度以及嵌套层级来生成某一形状的数组,arange又只能生成一维的数组。
如果我们想根据需要,生成指定形状的数组应该怎么办呢?
非常遗憾的是,array和arange方法并没有生成指定形状的参数,所以不能使用这两种方法直接生成我们需要的形状的数组。而需要通过其他的方法,将array和arange生成的数组转换成我们需要的形状,这就是reshape方法。
reshape是将原数组转换为指定形状数组的常用方法,就是在保持原数组元素个数也就是size不变的情况下,将其转换为新的形状,间接实现生成指定形状数组的目的。
reshape的参数为要转换成的目标数组的shape属性,也就是元组,同时可以将元组的括号省略。
reshape作为一种形状转换的方法,既可以在生成数组的同时进行形状转换,也可以直接对某一数组变量进行转换。
In [1]: import numpy as np
In [2]: arr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8]).reshape((2, 4)) # 一维数组转换成二维数组,参数包括元组的括号
arr1
Out[2]: array([[1, 2, 3, 4],
[5, 6, 7, 8]])
In [3]: arr2 = np.array([1, 2, 3, 4, 5, 6, 7, 8]).reshape(8,) # 一维数组转换成一维数组,参数省略元组的括号
arr2
Out[3]: array([1, 2, 3, 4, 5, 6, 7, 8])
In [4]: arr3 = np.array([1, 2, 3, 4, 5, 6, 7, 8]).reshape(1, 8) # 注意:结果和arr2不同
arr3
Out[4]: array([[1, 2, 3, 4, 5, 6, 7, 8]])
In [5]: arr4 = np.array([1, 2, 3, 4, 5, 6, 7, 8]) # 也可以先定义数组再进行转换
arr4.reshape(2, 2, 2) # 一维数组转换成三维数组
Out[5]: array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
In [6]: arr5 = np.arange(16).reshape(2,8) # 一维数组转换成二维数组
arr5
Out[6]: array([[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 12, 13, 14, 15]])
In [7]: arr6 = np.arange(16).reshape(4, 2, 2) # 一维数组转换成三维数组
arr6
Out[7]: array([[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]],
[[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15]]])
In [8]: arr7 = np.arange(16).reshape(2,2,2,2) # 一维数组转换成四维数组
arr7
Out[8]: array([[[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]]],
[[[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15]]]])
In [9]: arr8 = np.array([[0, 1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14, 15]]).reshape(2, 2, 2, 2) # 二维数组转换为四维数组
arr8
Out[9]: array([[[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]]],
[[[ 8, 9],
[10, 11]],
[[12, 13],
[14, 15]]]])
2、生成随机数组
在NumPy中,可以使用random模块生成多种数字类型和统计分布的随机数组。
a、random.randn
在《手把手陪您学Python》47——ndarray中,我们曾经利用np.random.randn生成过随机数组用于演示。
其实更确切地说,np.random.randn生成的是指定形状和元素个数的、服从标准正态分布(以0为均数、以1为标准差)的随机数组,其参数是我们指定数组的shape属性的元组。
In [10]: arr9 = np.random.randn(8) # 生成一维标准正态分布随机数组
arr9
Out[10]: array([-1.30988877, -0.34601258, 0.62283548, -0.44224255, 0.59793644,
-0.47838029, 1.3035945 , 0.14103263])
In [11]: arr10 = np.random.randn(2, 4) # 生成二维标准正态分布随机数组
arr10
Out[11]: array([[ 0.55654086, 0.85237979, -0.30700582, 0.48221887],
[ 0.55188505, 0.32153161, 1.58344657, -0.65548478]])
In [12]: arr11 = np.random.randn(2, 4, 3) # 生成三维标准正态分布随机数组
arr11
Out[12]: array([[[ 1.38638958, -0.53405764, 0.37561582],
[ 2.61848236, -1.85721341, -1.77189997],
[ 1.4103478 , -0.26590613, -1.29052235],
[-0.73189418, -1.55958112, 0.06913844]],
[[-0.20066016, -0.20109712, 0.82133339],
[ 0.47940501, 0.91032056, 0.95559913],
[-2.61454007, -1.17736678, -0.1120787 ],
[-1.36175475, 0.33004381, -0.656985 ]]])
b、random.rand
np.random.rand用于生成指定形状和元素个数的、服从“0~1”均匀分布的随机样本值。随机样本的取值范围是[0,1),但不包括1。其参数是我们指定数组的shape属性的元组。
In [13]: arr12 = np.random.rand(1, 8) # 生成二维均匀分布随机数组
arr12
Out[13]: array([[0.3652795 , 0.76874897, 0.10350589, 0.69743489, 0.36096167,
0.6949363 , 0.52513233, 0.36615817]])
c、random.randint
np.random.randint用于生成指定范围和个数的一维随机整数数组,其格式和参数为:
numpy.random.randint(low, high=None, size=None)
其中,low和high为位置参数,不需要写参数名称,size为关键字参数,必须要写参数名称。
当low和high都写时,随机整数的取值范围为[low, high),包括low但不包括high。
当low和high只写一个时,默认为low,取值范围为[0, low),包括0但不包括low。
当size省略时,默认size=1。
由于random.randint没有形状参数,所以要生成我们指定形状的数组时,需要使用reshape方法。
In [14]: arr13 = np.random.randint(10, 20, size = 5)
arr13
Out[14]: array([18, 18, 16, 19, 10])
In [15]: arr14 = np.random.randint(10, size = 5)
arr14
Out[15]: array([1, 9, 5, 8, 2])
In [16]: arr15 = np.random.randint(10, 20)
arr15
Out[16]: 14
In [17]: arr16 = np.random.randint(10)
arr16
Out[17]: 5
In [18]: arr17 = np.random.randint(20, size = 8).reshape(2, 2, 2)
arr17
Out[18]: array([[[ 5, 11],
[ 9, 15]],
[[ 4, 14],
[13, 2]]])
以上是三种较为常用的生成随机数组的方法。在NumPy的random模块中,还有其他可以用于生成随机数组的方法,大家可以根据需要进行了解和使用。
3、生成特殊数组
所谓的特殊数组,是指指定形状,并且均由0、1或者空值组成的数组,让我们分别来看一下。
a、ones
np.ones可以生成指定形状,并且全都由1组成的数组。
In [19]: arr18 = np.ones(8) # 生成一维数组时,元组括号可以省略
arr18
Out[19]: array([1., 1., 1., 1., 1., 1., 1., 1.])
In [20]: arr19 = np.ones((2, 3 , 4)) # 生成多维数组时,元组括号不可以省略
arr19
Out[20]: array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
b、zeros
np.zeros可以生成指定形状,并且全都由0组成的数组。
In [21]: arr20 = np.zeros(8)
arr20
Out[21]: array([0., 0., 0., 0., 0., 0., 0., 0.])
In [22]: arr21 = np.zeros((2, 3))
arr21
Out[22]: array([[0., 0., 0.],
[0., 0., 0.]])
c、empty
np.empty生成的是没有初始化的数值的数组。虽然返回的结果可能都是0(因为返回值不可能真的是空的),但是也有一定的可能返回的是没有初始化的垃圾数据,所以不能用np.empty生成全0数组。
In [23]: arr22 = np.empty((4, 2))
arr22
Out[23]: array([[0., 0.],
[0., 0.],
[0., 0.],
[0., 0.]])
d、eye
np.eye用于生成一个n×n的特征矩阵,也就是对角线的位置为1,其他位置为0的,长度和宽度都是n的数组,其参数就是n。
In [24]: arr23 = np.eye(5)
arr23
Out[24]: array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
以上就是另外几种生成数组的方法,结合我们在《手把手陪您学Python》48——数组的生成方法1中学习的数组生成的方法,基本上掌握了NumPy中常用的数组生成的方法。
接下来,我们将会学习几种常用的操作数组的方法,包括数组的变形、展开、翻转、拼接、拆分,以及对数组元素进行添加和删除等,敬请关注。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
要阅读《手把手陪您学Python》——NumPy系列文章的其他篇目,请关注公众号点击菜单选择,或点击下方链接直达。
《手把手陪您学Python》系列文章入门阶段的篇目已经全部完成。
为更加清晰地展示Python入门阶段的知识体系,整理了如下的鱼骨图,以方便大家查阅。
如要阅读相应篇目的内容,请关注公众号点击菜单选择,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手51”,即可免费下载本篇文章所用示例语句。
