《手把手陪您学Python》51——数组的生成方法2

在上一篇《手把手陪您学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》46——NumPy介绍

《手把手陪您学Python》47——ndarray

《手把手陪您学Python》48——数组的生成方法1

《手把手陪您学Python》49——数组的shape属性

《手把手陪您学Python》50——数组的dtype属性

 


 

《手把手陪您学Python》系列文章入门阶段的篇目已经全部完成。

为更加清晰地展示Python入门阶段的知识体系,整理了如下的鱼骨图,以方便大家查阅。

图片

如要阅读相应篇目的内容,请关注公众号点击菜单选择,或点击下方链接直达。

《手把手陪您学Python》1——为什么要学Python?

《手把手陪您学Python》2——Python的安装

《手把手陪您学Python》3——PyCharm的安装和配置

《手把手陪您学Python》4——Hello World!

《手把手陪您学Python》5——Jupyter Notebook

《手把手陪您学Python》6——字符串的标识

《手把手陪您学Python》7——字符串的索引

《手把手陪您学Python》8——字符串的切片

《手把手陪您学Python》9——字符串的运算

《手把手陪您学Python》10——字符串的函数

《手把手陪您学Python》11——字符串的格式化输出

《手把手陪您学Python》12——数字

《手把手陪您学Python》13——运算

《手把手陪您学Python》14——交互式输入

《手把手陪您学Python》15——判断语句if

《手把手陪您学Python》16——循环语句while

《手把手陪您学Python》17——循环的终止

《手把手陪您学Python》18——循环语句for

《手把手陪您学Python》19——第一阶段小结

《手把手陪您学Python》20——列表

《手把手陪您学Python》21——元组

《手把手陪您学Python》22——字典

《手把手陪您学Python》23——内置序列函数

《手把手陪您学Python》24——集合

《手把手陪您学Python》25——列表推导式

《手把手陪您学Python》26——自定义函数

《手把手陪您学Python》27——自定义函数的参数

《手把手陪您学Python》28——自定义函数的返回值

《手把手陪您学Python》29——匿名函数

《手把手陪您学Python》30——模块

《手把手陪您学Python》31——文件的打开

《手把手陪您学Python》32——文件的读取

《手把手陪您学Python》33——文件的关闭

《手把手陪您学Python》34——文件的写入

《手把手陪您学Python》35——数据的存储

《手把手陪您学Python》36——错误和异常处理

《手把手陪您学Python》37——程序的重构

《手把手陪您学Python》38——第二阶段小结

《手把手陪您学Python》39——面向对象

《手把手陪您学Python》40——类的定义、属性与实例化

《手把手陪您学Python》41——类的方法与实例方法

《手把手陪您学Python》42——类的魔法方法

《手把手陪您学Python》43——类的继承

《手把手陪您学Python》44——类的导入

《手把手陪您学Python》45——Python入门完结篇

For Fans:关注“亦说Python”公众号,回复“手51”,即可免费下载本篇文章所用示例语句。

亦说Python——Python爱好者的学习分享园地
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值