![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=1739249702-6sCVlgZWaO8eWyyP7NfQCF8va0E57mQc-0-33cd91a1f20699b063a05eb09dbaf850)
2.批量创建
除了手动给每个数组元素赋值,更多的时候是需要创建数组并按照一定规则批量填充数据。下面介绍使用Numpy提供的批量创建数组中数据的方法创建初值为0,终值为5(不包含终值),步长为1的数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_2.jpg?sign=1739249702-14lwHVle0Q1xz2Nw9ITqJ8kL6Nkm1YI4-0-e5fbf97584f1a0bbb714bacb3617d3a2)
创建初值为2,终值为5(不包含终值),步长为1的数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_3.jpg?sign=1739249702-7Ul7xpqXG4FqaK1u4L0nX66EYInsva0E-0-44445acc7af91a6aa5bffc24629832eb)
创建初值为2,终值为5(包含终值endpoint=True),元素为4个的等差数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_4.jpg?sign=1739249702-shvE9KzV7ssxzmvSJiEijGhWyBDftu6h-0-64d4a1d640b69fe98d0fd7d7fafbb99c)
创建基数为10的等比数组,首个元素为10^0=1,末元素为10^2=100,共5个元素。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_5.jpg?sign=1739249702-5tGID0510B19iyWxmkMrgFQ2DcRtDrSX-0-e648023f84a435f817c43d98d702296e)
批量创建N个相同元素的数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_6.jpg?sign=1739249702-ErzCVGxcmMm9GGd5tXJ9zeu3dDoOM5V6-0-19167932952e2bddf626183e5ae2abae)
创建与给定数组形状相同的新数组:本例中,用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=1739249702-BTxBEcQ3T9oiDf7alHDdIeUKxCzNKNgv-0-ed8530f96079cb4a8823bab1bc70effe)
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=1739249702-txd1JTJRQ2tS7RQsKKDVSR3fSxTP1NRh-0-f7b46a87597d78d05744ec263cfddd73)
np.from*系列函数用于通过现有的数据创建数组,本例使用np.fromfunction函数创建二维数组九九乘法表,第一个参数是调用的函数名,第二个参数是数组的形状。该系列函数还包括frombuffer,fromstring,fromiter,fromfile,fromregex等函数。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_57_9.jpg?sign=1739249702-ma2BrT5xOBI1CNYbVDqM3reM2aRFhNFo-0-0b4250c6074c10c1d50158c4bee8df7e)
2.1.2 访问数组
1.访问数组元素
通过指定索引值访问单个元素,支持正向索引和反向索引。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_1.jpg?sign=1739249702-OHVWSSK5qyQWCOFiLjk9lwS6WdPpOiiz-0-52a1bf8687444ee0c99a75f96bfa1d9a)
通过索引值列表返回多个元素并形成新的数组,新数组与原数组不共享内存,支持多维度索引。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_2.jpg?sign=1739249702-EfSoQAoISM5tWIZ8YShovdBRd1nxSldu-0-97396ea20357d651f10bad32ae4225e0)
根据值的范围获取子数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_3.jpg?sign=1739249702-ljUlXOOrme30fr0BlkL23xRhXIYTTdC3-0-cd9cc3793d755c09e616cda77c1bac43)
以布尔值方式获取数组元素,True为选取对应位置的元素。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_4.jpg?sign=1739249702-PLC0qHbxWgZb9l5apQTbiDccBlb5raJy-0-cd5d70b00cd1c6ffb36e8b43e5d4e5bf)
ndarray还支持切片方式获取子数组,切片格式为[起始位置:终止位置:步长],不包含终止值,使用格式中三个元素的组合取子数组,切片与原数组共享同一空间。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_5.jpg?sign=1739249702-cH5mufdAzUL0MOrzaHKWq1n2jirZwx46-0-d8a78b9790929bd861d97dcaee6de3bd)
在访问多维数组时,用元组(即圆括号)作为下标。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_6.jpg?sign=1739249702-KUacGBXB9TbaTI22ojcmUoRoWXt9M9Me-0-8c61c5431e51df7fec32cf083f1813a7)
2.常用的数组属性
属性shape用于描述数组的维度。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_7.jpg?sign=1739249702-xQ1kfWlW1utRlFxOGNEt7nPPd4EqZHoh-0-72c508a4ea2784569d693ff1c27fafd6)
属性dtype用于描述数组的元素类型。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_8.jpg?sign=1739249702-iIteNBpftXaT7ru8SbXvpdmr3K94iDLO-0-74631686f9c56aed5a6f120b3f65aff1)
属性ndim用于描述数组维度的个数,也称作秩。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_58_9.jpg?sign=1739249702-QqWlWnP0nP4rzDDdGQCOKspAr4CDLpEH-0-9863f0de88839cbeddaf478a7f6f86e2)
属性size用于描述数组包含的元素个数。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_1.jpg?sign=1739249702-luVf1r4L02JsIPswb7R1QhfXM9xZgMAr-0-b8d11ac56f103c21ecf0545c93ff8065)
属性nbytes用于描述数组所占空间大小。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_2.jpg?sign=1739249702-yQURe2NJIc6Jtz6LwSz5zJuU1ZHy1qla-0-f35ae82b33b13621f3e8c4504e3b41a8)
2.1.3 修改数组
上一小节介绍数据元素值及属性的查询方法,本小节将从增、删、改几方面介绍ndarray的编辑方法。
1.添加数组元素
ndarray方法支持向数组中添加元素后生成新数组:append方法支持在数组末尾添加元素,insert方法支持在指定位置添加元素。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_3.jpg?sign=1739249702-OJO6SWHjqy8gvktyr2aPjqCZvdQk3dc6-0-9df50f6d1f5386fc67df59cea449ccf7)
2.删除数组元素
ndarray方法支持使用索引值删除数组中的元素并返回新数组。本例中,删除数组中索引值为3的元素(即第四个元素)。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_4.jpg?sign=1739249702-5rB6WO6R7LUl0d2lNzDz7sOrvmJjY7Sr-0-8af3a869c484f46b62fac7e85018610c)
3.修改元素值
使用索引值修改单值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_5.jpg?sign=1739249702-VwhH2jE3o9fMCITHtmgo8BSfxTOJEE9K-0-3e580743777eb921b042ec4f0d1eea20)
使用切片方法修改多值。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_59_6.jpg?sign=1739249702-MSW438QcyMn5KqENkkrKZ9C2vb5aNhso-0-21c3e53e66790e0f9078fadd6a3a13dc)
4.修改形状
使用reshape方法可修改数组形状,当参数设置成-1时为自动计算对应值。reshape方法返回的数组与原数据共享存储空间。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_60_1.jpg?sign=1739249702-KWdR1OTyX3jKEn8qF10567gjXaTZKHeM-0-47eb64e0ed8df143fe928b82a909f427)
5.修改类型
首先,查看Numpy库支持的所有数据类型。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_60_2.jpg?sign=1739249702-ZcBr6G6uB3XquQlEXrQbtYWcscIJRpYi-0-ea951fa8ef8c10d9b9bbf2d325b6f52f)
其次,指定类型并创建数组。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_60_3.jpg?sign=1739249702-wr6ulLKz88WNUNnBf6NTlXXy6yds3FmN-0-48ea0c310240596bfa9f1e4a8449ea0b)
最后,转换数组中数据的类型,并查看其转换后的具体类型。
![](https://epubservercos.yuewen.com/57F11A/16699150105739906/epubprivate/OEBPS/Images/38425_60_4.jpg?sign=1739249702-gwDYaYDO8lUSjv5WYBRfIkOsD2eTUm1L-0-16fd41e3d67898c1288b4fd0da0685dd)