![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=1738818332-h2Yi7fuFYP8CiHV1lk6STeAF3bzVnIWq-0-dd22210ab229c5a981325bdd0ee5c698)
2.批量创建
除了手动给每个数组元素赋值,更多的时候是需要创建数组并按照一定规则批量填充数据。下面介绍使用Numpy提供的批量创建数组中数据的方法创建初值为0,终值为5(不包含终值),步长为1的数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_2.jpg?sign=1738818332-61vfZ7yqm1RrGFK2EyuBE1VByg3EdCuL-0-34a2875a4e78b0c9c29f3afe96184eb4)
创建初值为2,终值为5(不包含终值),步长为1的数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_3.jpg?sign=1738818332-AqDkKrP3O0CQOw4nIKwS3hK6OlH3LCXI-0-960e5c09a884da00fab077544fb4a812)
创建初值为2,终值为5(包含终值endpoint=True),元素为4个的等差数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_4.jpg?sign=1738818332-V1Jm2bOjIWyVPsPiccOTmiWgLChqZEXH-0-ee9d1ce253e04a21727bee0e5210c09c)
创建基数为10的等比数组,首个元素为10^0=1,末元素为10^2=100,共5个元素。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_5.jpg?sign=1738818332-h12z2WuNWbTMkrisdylLgZT3BVjQ0iu2-0-81c363345b474c4ae1e3bb427a5472dd)
批量创建N个相同元素的数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_6.jpg?sign=1738818332-g4Qo2NVbrVbeY8qt4GzIITyMH66qxWf1-0-a44e785abb2501ef1f5112e2205628b5)
创建与给定数组形状相同的新数组:本例中,用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=1738818332-O1Lj2yE0pV1H1mg1MACzGuGhl8fiHa8L-0-a039aaebcdd4623c48409d477474b4a6)
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=1738818332-npoSJjtHMVAxcJ919QvxraaB60UuTtMA-0-db07e76404e7dade941040d7828d4c1e)
np.from*系列函数用于通过现有的数据创建数组,本例使用np.fromfunction函数创建二维数组九九乘法表,第一个参数是调用的函数名,第二个参数是数组的形状。该系列函数还包括frombuffer,fromstring,fromiter,fromfile,fromregex等函数。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_9.jpg?sign=1738818332-xdJdbHBCDmMnZRbGATPGQBVidhtNpacK-0-7f9b4656a4d330ba31920f65134b1cdd)
2.1.2 访问数组
1.访问数组元素
通过指定索引值访问单个元素,支持正向索引和反向索引。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_1.jpg?sign=1738818332-ec5BVQxFQQA58qeTL48K8KIYpvFBkg2k-0-c7805ce7b22c6ad03fe861d8ecbb2ac8)
通过索引值列表返回多个元素并形成新的数组,新数组与原数组不共享内存,支持多维度索引。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_2.jpg?sign=1738818332-4RDWf99gasK1bRbda23CFDngKCYl9fya-0-fd5d6cd255ece2335c2f6ca8074916b9)
根据值的范围获取子数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_3.jpg?sign=1738818332-PuFTVw6BAWghi6lRdX4SfwXGK2BVOTPw-0-2508bcbe73b8a215f939792c730fdbfb)
以布尔值方式获取数组元素,True为选取对应位置的元素。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_4.jpg?sign=1738818332-s06eIDPI7CAf6Z4eMJUlwMgpBSxP9tmx-0-3f2ce761652f7660f2894cc850cba12d)
ndarray还支持切片方式获取子数组,切片格式为[起始位置:终止位置:步长],不包含终止值,使用格式中三个元素的组合取子数组,切片与原数组共享同一空间。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_5.jpg?sign=1738818332-tUmJZiZ5lQZqncDeupsHBBi7DDJ2uXVn-0-e03835c2e1703cec5bcd6ec9f7d7a377)
在访问多维数组时,用元组(即圆括号)作为下标。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_6.jpg?sign=1738818332-90H3BNVYhlckCPI2wlFDwuT2G7Wqro9P-0-308157218df21abf84756bafd12efa46)
2.常用的数组属性
属性shape用于描述数组的维度。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_7.jpg?sign=1738818332-MiIiVTkh4JWiQ7xLZu6sR9DjwNVZzTNr-0-eb450c67d33cdd095218360575d9b60e)
属性dtype用于描述数组的元素类型。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_8.jpg?sign=1738818332-eN8ewh3XC4tytTribejixfYGKH0FgR0G-0-238be87c6820da4b6f843c1033de9faa)
属性ndim用于描述数组维度的个数,也称作秩。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_9.jpg?sign=1738818332-SJwZlux3WtdvISwsN5V493KLuIBMTVO3-0-0d69108efd2bdfd855f68c3f8324409b)
属性size用于描述数组包含的元素个数。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_1.jpg?sign=1738818332-1R2wZgZi8SBujdXIEead76z8KDbyLsrX-0-5357d0322d5ec88f24ec7f7d37cce250)
属性nbytes用于描述数组所占空间大小。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_2.jpg?sign=1738818332-lN8hZi2p0f7vL69s4el8MzDH8BRh2u62-0-25dcf8353e07515aad144f4c3255498a)
2.1.3 修改数组
上一小节介绍数据元素值及属性的查询方法,本小节将从增、删、改几方面介绍ndarray的编辑方法。
1.添加数组元素
ndarray方法支持向数组中添加元素后生成新数组:append方法支持在数组末尾添加元素,insert方法支持在指定位置添加元素。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_3.jpg?sign=1738818332-sxJ5CF3inb8b4HJZVyFwgKo1wEkxWXX1-0-48c91d31593269436a22aafb205e5dd9)
2.删除数组元素
ndarray方法支持使用索引值删除数组中的元素并返回新数组。本例中,删除数组中索引值为3的元素(即第四个元素)。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_4.jpg?sign=1738818332-YSCC23M1TD5RfmpkMfE6pyJAjgmMSlRI-0-fbec621b61add162cb01794271eede76)
3.修改元素值
使用索引值修改单值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_5.jpg?sign=1738818332-v5rukf96hXHVuqLHR9hX7RHCd4P3Qf5P-0-f637d252871e9b755ec4bab7896bac9e)
使用切片方法修改多值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_6.jpg?sign=1738818332-9CVaoCNUJEcgUvhLJhFFlrNtRj94jMeA-0-86fdccf7d4e46c718f7b399140a808df)
4.修改形状
使用reshape方法可修改数组形状,当参数设置成-1时为自动计算对应值。reshape方法返回的数组与原数据共享存储空间。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_60_1.jpg?sign=1738818332-C9pTWgbNRckuiX6bbymQAUOdpvhB0jom-0-0b1c87756978b1dd67174be65d8c9aa3)
5.修改类型
首先,查看Numpy库支持的所有数据类型。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_60_2.jpg?sign=1738818332-ZqiyOHVD0yT5GIkNl9zLQzkwZ2g9Zy9X-0-9785e8441e3911908985544861a315bf)
其次,指定类型并创建数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_60_3.jpg?sign=1738818332-KIDHRUGC9XSrSQNnuCcRJ8IHrI0IeQyN-0-e516d83a069ea22af50f13375d453140)
最后,转换数组中数据的类型,并查看其转换后的具体类型。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_60_4.jpg?sign=1738818332-b2hm5a6yvxScSwJ3KMDUn860rX1YU1Bb-0-cdebd10536af647322d8f6d3a548e323)