1.概述
今天我们来讲一下Numpy数组的索引与切片,numpy数组的索引与切片和Python中的切片与索引的作用相同,可以快速的取出数据,进行下一步的运用或者查看,但是两种切片还有一些不同的地方。另外我们可以通过数组的变形拼接分裂快速的对数组进行做出改变,方便我们更快的对数组进行操作。
一、一维数组的索引与切片
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
索引方式:
- X[index_value]
切片方式:
- X[start:stop:step]
首先创建一个数组
![13825820-bfe2d56876a6e410.jpg](https://i-blog.csdnimg.cn/blog_migrate/198805510a5b5929ada3850a006980a4.jpeg)
对数组进行索引,找到索引为2和6的元素
![13825820-7d84634d721949fa.jpg](https://i-blog.csdnimg.cn/blog_migrate/c6b64186c55ea3f3fbee460a739eb2b7.jpeg)
对数组进切片,查找从2开始到8结束,步长为2的元素。
![13825820-f3c81de2f60ef652.jpg](https://i-blog.csdnimg.cn/blog_migrate/cadf5c898cb6adfaa86a039fff0a0f62.jpeg)
需要注意的是,切片的结果会产生新的内存地址,如果要引用切片值,需要赋值给新的变量。
二、高维数组索引&切片
与Python原生的列表、元组不同的是,Numpy数组支持多维数组的多维索引,每一个逗号, 代表索引的一个维度
索引方法:
x[维度,行,列]
x[维度][行][列]
二维和一维数组可以不指定维度
切片方法:
x[维度的[start:stop:step],行的[start:stop:step],列的[start:stop:step]]
可以不指定步长,会默认为1
首先设置两个多维数组
![13825820-725120648f4f8797.jpg](https://i-blog.csdnimg.cn/blog_migrate/feb467fa698b6098f3d519f91e91b597.jpeg)
1、索引
1.1索引出x1中第1行第1列的元素
![13825820-28d7f332bdc1a332.jpg](https://i-blog.csdnimg.cn/blog_migrate/a88847050c7eee87d597955f9f1cda32.jpeg)
1.2 索引出x2中第1个维度的第1行第1列的元素
![13825820-924b48c7fb082a4c.jpg](https://i-blog.csdnimg.cn/blog_migrate/1f656998593f37d04dae92a2daaaa842.jpeg)
2、切片
设置一个5维5行5列的np数组
![13825820-32b9e232a32a219a.jpg](https://i-blog.csdnimg.cn/blog_migrate/7703faeca068e422b9a5d2a895163be7.jpeg)
2.1 切片出第二个维度中的第三行数据
![13825820-cf2342ffabf38bd1.jpg](https://i-blog.csdnimg.cn/blog_migrate/cf16a5a31d826a31c6864073af659875.jpeg)
2.2 切片出第三个维度中的第二行的第三个元素
![13825820-d25dfad4167a91bc.jpg](https://i-blog.csdnimg.cn/blog_migrate/e2d53b718cde835abee796d39b7e5144.jpeg)
2.3 切片出第二个维度中的第一行和第三行的第四个元素
![13825820-8431afe15e679451.jpg](https://i-blog.csdnimg.cn/blog_migrate/102f09e957dfc4f3e10cb3b5b62caae6.jpeg)
- 切片出前两个维度的第一行和第三行的前两列
![13825820-086782960050ee1f.jpg](https://i-blog.csdnimg.cn/blog_migrate/88b5759f5eb9314232bd033970832e60.jpeg)
三、修改元素值
1、修改某一个元素
1.1设置一个数组
![13825820-a7eb97ca9439ca7d.jpg](https://i-blog.csdnimg.cn/blog_migrate/ecfc3428037c7a685a9346a367828185.jpeg)
1.2转换数据类型为浮点型
![13825820-b14b386844316d03.jpg](https://i-blog.csdnimg.cn/blog_migrate/62dc1090c0cd54806a01960709bd915a.jpeg)
![13825820-157d351d04630789.jpg](https://i-blog.csdnimg.cn/blog_migrate/f30a2056021c9b4c116dee425ca5b1d7.jpeg)
1.3将f1中的第三个元素改为3.14
![13825820-77aacd2f40e7bd39.jpg](https://i-blog.csdnimg.cn/blog_migrate/23ded6a902de93887b94b5e9599e2d89.jpeg)
2、修改数组中的多个元素
![13825820-89f0a708e31f706b.jpg](https://i-blog.csdnimg.cn/blog_migrate/654933eb528b939cd1ed1b6c4ed66681.jpeg)
2.1将x3的前三个模块的第3行的第4列的元素改为2333
![13825820-29d4129e1555b7b1.jpg](https://i-blog.csdnimg.cn/blog_migrate/97d55c4af0bf7271d8117f6bca57a270.jpeg)
四、其它索引方式
1、整数索引
如果一个 ndarray 是非元组序列,数据类型为整数或布尔值的 ndarray,或者至少一个元素为序列对象的元组,我们就能够用它来索引 ndarray。高级索引始终返回数据的副本。与此相反,切片只提供了一个视图。
整数索引就是两种高级索引的类型之一,另一个高级索引方式为 布尔值索引。
整数索引有助于基于 N 维索引来获取数组中任意元素。每个整数数组表示该维度的下标值。当索引的元素个数就是目标 ndarray 的维度时,会变得相当直接。以下示例获取了 ndarray 对象中每一行指定列的一个元素。因此,行索引包含所有行号,列索引指定要选择的元素。
![13825820-2caf969c2ced3998.jpg](https://i-blog.csdnimg.cn/blog_migrate/d0786ce94b2239a8157161fd08fc8757.jpeg)
该结果包括数组中 (0,0) ,(1,1) 和 (2,0) 位置处的元素。
但如果需要的是按数字对行列同时进行索引的而不是索引单个值的话,应当使用下面的方式:
![13825820-e4398e4ce47c3665.jpg](https://i-blog.csdnimg.cn/blog_migrate/84e3a4463a1c5b29580cc1e909458be4.jpeg)
也可以利用数字索引生成同样维度的数组:
![13825820-7fccfd640212fa1c.jpg](https://i-blog.csdnimg.cn/blog_migrate/e49fdd2e2fe8a2b4b78fb5aacdf2e864.jpeg)
![13825820-73658f6868a33de7.jpg](https://i-blog.csdnimg.cn/blog_migrate/a28c72719e86069b232e9307c3875c09.jpeg)
2.布尔索引
当结果对象是布尔运算(例如比较运算符)的结果时,将使用此类型的高级索引。
2.1设置一个4行3列的数组
![13825820-b316e58721519570.jpg](https://i-blog.csdnimg.cn/blog_migrate/a7f14124827455cd11dabe60801ce5ec.jpeg)
2.2查看数组中大于5的元素
![13825820-ca10e3e9429250bb.jpg](https://i-blog.csdnimg.cn/blog_migrate/91c4ba00ba2859c525c58f2513a4d692.jpeg)
2.3 将数组中大于5的元素索引出来
![13825820-6364305e80e48b4f.jpg](https://i-blog.csdnimg.cn/blog_migrate/ae2b9bd8347712737f070a476f9c69e8.jpeg)
五、关于视图
关于数组切片有一点很重要也非常有用,那就是数组切片返回的是数组数据的视图,而不是数值数据的副本。这一点也是 NumPy 数 组切片和 Python 列表切片的不同之处:在 Python 列表中,切片是值的副本。
对于切片出来的视图或视图中索引出来的元素(其实也是一个视图)进行修改时,原始数据也会被改变。因此我们想要保护原始数据,应该先创建副本,在副本上进行操作,以保证原始数据不被修改。
六、数组的变形拼接分裂
1、数组的变形
1.1 np.reshape()不改变数据的条件下修改形状
示例:将一个一维数组变成3*4数组
![13825820-7a80fb955d5bd8ff.jpg](https://i-blog.csdnimg.cn/blog_migrate/d87be05fcef661c5bd5333de0f1240e2.jpeg)
需要注意的是:变换形状之后的数组大小必须和原始数组相同
![13825820-113fb6861749efbc.jpg](https://i-blog.csdnimg.cn/blog_migrate/0938859304b351b282df5c1cd7be33be.jpeg)
Xx1的数组的长度为10,无法变形为3行4列的数组,这时候就会报错,reshape()还有一个功能,就是帮我们回去行向量和列变量。
![13825820-a2520b2c2b2bd72b.jpg](https://i-blog.csdnimg.cn/blog_migrate/b033f5691725c8f3452ff8c2b8e9531d.jpeg)
在使用reshape()的时候,可以将其中一个维度指定为-1,这样numpy就会自动计算出它的真实值。
1.2 np.newaxis 和reshape()方法获取行向量和列向量功能一样,np.newaxis方法也可以帮我们获取行向量与列向量
- 行向量:
![13825820-56aabf04c7e1062c.jpg](https://i-blog.csdnimg.cn/blog_migrate/4d5331951890d18d79a786b1a4695762.jpeg)
- 列向量
![13825820-1ca5fe21ed79f64a.jpg](https://i-blog.csdnimg.cn/blog_migrate/c1d00444066f6eb18a8e16a9579d56b4.jpeg)
Np.newaxis()比np.reshape()更高级的是:np.newaxis是和索引切片方法一起使用的,可以制定获取行列向量的长度,即先切片在转换成行向量或列向量
2、数组的拼接
当我们需要对多个数组进行操作时,这时候就需要拼接数组了,numpy提供了对数组进行拼接的方法
![13825820-9fa4d75b77983435.jpg](https://i-blog.csdnimg.cn/blog_migrate/26d59b97717b37dc0868828a193ec096.jpeg)
2.1 np.concatanate()
数组本身构成的列表作为np.concatenate()的参数之一,还有一个常用的参数是axis,用来指定拼接的方向:
axis = 0 按行拼接
axis = 1 按列拼接
默认的参数为axis = 0
- 按行拼接(横向拼接)
![13825820-3037c5768b782fdd.jpg](https://i-blog.csdnimg.cn/blog_migrate/21a57fc282b0e323a0c5450cf362cd3f.jpeg)
- 按列拼接(纵向拼接)
![13825820-4476b16ad6c3c9a6.jpg](https://i-blog.csdnimg.cn/blog_migrate/45b8633245e4bc4c12ca7fc5f4f1e0a5.jpeg)
2.2np.vstack()
垂直栈拼接,按行拼接,数组本身构成的列表作为np.vstack()的参数
![13825820-e41be2d36186ba65.jpg](https://i-blog.csdnimg.cn/blog_migrate/b8dfe7061680780bdc14b3440464cba1.jpeg)
2.3 np.hstack()
平行栈,按列拼接,数组本身构成的列表作为np.hstack()的参数
![13825820-e4485d24d0e7984a.jpg](https://i-blog.csdnimg.cn/blog_migrate/d8debb8c899b92040ecd00289a56408e.jpeg)
2.4 np.dstack()
第三维度拼接,数组本身构成的列表作为np.dstack()的参数
![13825820-4b33d6762fd8f0e3.jpg](https://i-blog.csdnimg.cn/blog_migrate/30ff14cf40f6c26e4caacea33f6ad3fb.jpeg)
3、数组的分裂
同数组的拼接一样,在处理多个数组时,也需要将数组进行分裂,numpy同时也提供了数组分裂的方法。
3.1 np.split()
在指定位置分裂,数组本身作为一个参数,分类位置构成的列表作为第二个参数,同时split也可以对一维数组和多位数组进行操作。
- 一维数组/行向量/列向量
![13825820-4e6949afe8fc81dc.jpg](https://i-blog.csdnimg.cn/blog_migrate/cccd60cf08faf936aa6492a6851e4ea2.jpeg)
- 多维数组
![13825820-aa7530ff2e031235.jpg](https://i-blog.csdnimg.cn/blog_migrate/9fd78de1998b1dce1362a91d2b3685a6.jpeg)
3.2 np.hsplit()
按列在指定位置分裂
![13825820-5804b987f7fe6540.jpg](https://i-blog.csdnimg.cn/blog_migrate/6e2863dd09e233cab3c6dd9f0d5459b0.jpeg)
3.3 np.vsplit()
按行在指定位置分裂
![13825820-934dce032895395c.jpg](https://i-blog.csdnimg.cn/blog_migrate/729c0025cb95994f63c4ab3a78b50c05.jpeg)
4.数组的平铺
数据可以通过np.ravel()方法将多维的数组平铺成一维的数组。
![13825820-996968b8e0bb804c.jpg](https://i-blog.csdnimg.cn/blog_migrate/982b7a0c88f9fa80420dc700e42a3364.jpeg)