![Python大数据与机器学习实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/134/30638134/b_30638134.jpg)
2.1 多维数组
多维数组(n-dimensional array,简称ndarray),是在数据处理领域中必用的数据结构,类似于基本数据结构中的列表:有序且内容可修改。我们可以将多维数组看成Python基本数据类型的扩展,其提供更多的属性和方法。
2.1.1 创建数组
1.类型转换方式创建
利用类型转换方式创建数组是最常见的数组创建方式,本例中使用np.array类型转换方法分别将元组和列表转换成一维数组和三维数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_1.jpg?sign=1739250603-LptRwpLNQdAKY4zQ11Rhed5zpDzVgP9E-0-f6a4037156babf0fe68111627427e866)
2.批量创建
除了手动给每个数组元素赋值,更多的时候是需要创建数组并按照一定规则批量填充数据。下面介绍使用Numpy提供的批量创建数组中数据的方法创建初值为0,终值为5(不包含终值),步长为1的数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_2.jpg?sign=1739250603-UYb2ilwOjT1tqMo05I72oROM1outNKDP-0-68ae9441951ff52e1c9d0f006be1b818)
创建初值为2,终值为5(不包含终值),步长为1的数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_3.jpg?sign=1739250603-952vdKsDEGGzw7F3ZKKyeDQm3FZPSeG4-0-f9fc8444c2bdfd744b57cd9dd512ec6d)
创建初值为2,终值为5(包含终值endpoint=True),元素为4个的等差数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_4.jpg?sign=1739250603-fUpHHDs2MYuqJ3ghoVOMdGSZvWAbsJkx-0-c03c6e4b11f936710795ae77be653234)
创建基数为10的等比数组,首个元素为10^0=1,末元素为10^2=100,共5个元素。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_5.jpg?sign=1739250603-LCAQpbjka2OZ0olPYttWcPGsooNnJXB1-0-2a5dffb89c1c563aa67926817b8fbe68)
批量创建N个相同元素的数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_6.jpg?sign=1739250603-mjCy6FRa4vlosxVjAYqq16bzDUftRmEO-0-5e91736b2d4a48c9a60ebc77b4c3048a)
创建与给定数组形状相同的新数组:本例中,用zero_like方法创建了元素全为0且形状与a相同的数组b,而创建值全为1(ones_like)、全为空(empty_like),以及全为某一特定值(full_like)数组的方法与此类似。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_7.jpg?sign=1739250603-ZQBgZWyxG4XRYk7anvfg227NSJTlc62j-0-4d200c93fb5f0eb4b5dfa57003a65948)
Numpy.random系列函数用于创建随机数组:本例使用randint函数创建最小值为1,最大值为3(不包含最大值),元素为5个的整型数组;Numpy.random还提供了rand函数来创建0~1分布的随机样本数组、randn函数来创建标准正态分布样本数组等。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_8.jpg?sign=1739250603-yIGN4VtctzAF0THRE0MCZZsEpHdplbyk-0-3ce68064059bcb897919c35aff1b1e51)
np.from*系列函数用于通过现有的数据创建数组,本例使用np.fromfunction函数创建二维数组九九乘法表,第一个参数是调用的函数名,第二个参数是数组的形状。该系列函数还包括frombuffer,fromstring,fromiter,fromfile,fromregex等函数。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_9.jpg?sign=1739250603-oTEG9Ugv0tbweeiQpNNWEhOfU0J5Fs6x-0-6225bb096d62862a79bcf3da1eaedc0c)
2.1.2 访问数组
1.访问数组元素
通过指定索引值访问单个元素,支持正向索引和反向索引。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_1.jpg?sign=1739250603-ME9wt9HVeeZzALu0IdIsF1Lfk41c5PkO-0-9751ba96c78bb5229cb9735e236b2231)
通过索引值列表返回多个元素并形成新的数组,新数组与原数组不共享内存,支持多维度索引。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_2.jpg?sign=1739250603-DoBksayeehfiwlBBWMjXuddvQveMBLUt-0-0f4886a212d9e3ed252fca7748affbc0)
根据值的范围获取子数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_3.jpg?sign=1739250603-Ngl2nOcCXhn0z61a62NhqpmR49vHm1UN-0-52f254c733241080322fee622c573809)
以布尔值方式获取数组元素,True为选取对应位置的元素。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_4.jpg?sign=1739250603-j6uaO5Kw3PeXL3nWNujAtn6HUTXmeKKM-0-cb6bdb4ee4c75d36de500474da342cba)
ndarray还支持切片方式获取子数组,切片格式为[起始位置:终止位置:步长],不包含终止值,使用格式中三个元素的组合取子数组,切片与原数组共享同一空间。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_5.jpg?sign=1739250603-Nj0N8zZdSKOFQe4386Pl0opFd8Ry0vf9-0-e44b30a83df4ff6e3b8d21f778c6c6f3)
在访问多维数组时,用元组(即圆括号)作为下标。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_6.jpg?sign=1739250603-ui2bdwW73XLSqzicAWGhWAFwDKDiLgxu-0-974623f344764471945c16acb5b9a87a)
2.常用的数组属性
属性shape用于描述数组的维度。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_7.jpg?sign=1739250603-wpuKy0Dpn3hXsPDbBvYH2eRAJAZZzNgv-0-534d78be950eb73a14d54df2cb009f8c)
属性dtype用于描述数组的元素类型。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_8.jpg?sign=1739250603-NFXR77GEBH62eKaw2iqB8WmbgyPVXcOS-0-56b15236d7006599312f1338dd7d4073)
属性ndim用于描述数组维度的个数,也称作秩。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_9.jpg?sign=1739250603-OMvTyt2JoulYBSCIWPFY4QaLO0tN3XWK-0-2daaaa802f635ea50f1740539e533b9c)
属性size用于描述数组包含的元素个数。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_1.jpg?sign=1739250603-5wv34wenMYJe1ynOUXmSsBstMeefybRL-0-d9d8c2f7c9890a0a4ec09a000436aae9)
属性nbytes用于描述数组所占空间大小。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_2.jpg?sign=1739250603-pdKJW1mWVgu8c1cstUeaDSUc4BclOB2X-0-caf13f14b49784c2f48c00a1e9bdb74c)
2.1.3 修改数组
上一小节介绍数据元素值及属性的查询方法,本小节将从增、删、改几方面介绍ndarray的编辑方法。
1.添加数组元素
ndarray方法支持向数组中添加元素后生成新数组:append方法支持在数组末尾添加元素,insert方法支持在指定位置添加元素。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_3.jpg?sign=1739250603-ZIWxYKnTJ3kZqqvC6AbHMKx2XERx64Eh-0-ab89823518d1d909f56a4221e693df1b)
2.删除数组元素
ndarray方法支持使用索引值删除数组中的元素并返回新数组。本例中,删除数组中索引值为3的元素(即第四个元素)。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_4.jpg?sign=1739250603-CKqVY1tFhzfD1pqCy1A7IEwC1AlHLp6Q-0-f68a5dfabe407f576f28656f2ae833ee)
3.修改元素值
使用索引值修改单值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_5.jpg?sign=1739250603-DqdYJK1KhaLlqnypNtLhc6T5VOJgPAES-0-e1c37317eab2347735cda310ede1e0d1)
使用切片方法修改多值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_6.jpg?sign=1739250603-E85s2rEhT0DikScabHvPprQs9w5vZQSB-0-09bc1a291596838fb30a7f2c0c6a1aed)
4.修改形状
使用reshape方法可修改数组形状,当参数设置成-1时为自动计算对应值。reshape方法返回的数组与原数据共享存储空间。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_60_1.jpg?sign=1739250603-CDPD5RVj6H2nKpkU5tE4G8Iq6QLOnVSg-0-33dbf69f4d2d105006ace3bae4c4a048)
5.修改类型
首先,查看Numpy库支持的所有数据类型。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_60_2.jpg?sign=1739250603-czUcNejv1UDYuTfkNzobkgfhG4Dlcx23-0-0e5b824fbd68ba12e1e5154a393aa11e)
其次,指定类型并创建数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_60_3.jpg?sign=1739250603-DK6Fa8dFBWkkuhNRScA7N5Me1Euhc9r5-0-ceabf157b80ec43d249765e4e4d68f52)
最后,转换数组中数据的类型,并查看其转换后的具体类型。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_60_4.jpg?sign=1739250603-aN2RdIlWOkBZUfBUOXIymQOg43GMgPwY-0-6892acf234c83b6d64f38f7980977d63)