您好,欢迎来到测品娱乐。
搜索
您的当前位置:首页numpy切片操作

numpy切片操作

来源:测品娱乐
numpy切⽚操作

numpy切⽚操作

⼀、总结

⼀句话总结:

> numpy切⽚结构:array[start:stop:step,start:stop:step],前⾯的start:stop:step表⽰⾏,后⾯的start:stop:step表⽰列

arr1=np.arange(1,17).reshape((4,4))print(arr1)[[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16]]print(arr1[1:3,1::2])[[ 6 8] [10 12]]

⼆、numpy数组切⽚操作之[:,2]、[-1:,0:2]、[1:,-1:]等都是啥?

注:最近在看代码,有好多关于numpy库的函数,尤其对于numpy数组,什么[:,2]、[-1:,0:2]、[1:,-1:]搞得⼀脸懵逼,百度没找到解释得很到位的,官⽹教程也也真是够简洁的。所以,还是得⾃⼰去实打实的敲⼀下,加强理解。numpy数组切⽚操作

通过冒号分隔切⽚参数 start:stop:step 来进⾏切⽚操作:形如:

b = a[2:7:2] # 从索引 2 开始到索引 7 停⽌,间隔为 2

冒号 : 的解释:如果只放置⼀个参数,如 [2],将返回与该索引相对应的单个元素。如果为 [2:],表⽰从该索引开始以后的所有项都将被提取。如果使⽤了两个参数,如 [2:7],那么则提取两个索引(不包括停⽌索引)之间的项。

⼀维数组

⼀维数组就如上所说,直接给例⼦看

>>>import numpy as np

>>>a = np.array([1,2,3,4,5,6,7,8])

1.只有⼀个参数

>>> a[1] #具体的元素 22

>>> a[1:] #冒号前⾯是起,后⾯是⽌,冒号前⾯空,指最⼩0,后⾯放空就是到最后,这⾥是⼀维数组array([2, 3, 4, 5, 6, 7, 8])

对⽐⼀下下⾯这两个,⼀个是⼀维数组,⼀个是具体的单个元素,为什么呢?看后⾯解释。

>>> a[7:]array([8])>>> a[7]8

2.两个参数

>>> print(a[1:3]) #从索引1开始,也就是第⼆个元素2,到索引3,不包括索引3[2 3]

3.三个参数

>>> print(a[1:7:2]) #从索引1开始,到索引7,不包括索引7,间隔为2[2 4 6]

⼀维数组,很好理解,毕竟中括号[]⾥只有冒号:,没有逗号,

⼆维数组

先定义⼀个⼆维数组

>>> import numpy as np

>>> a = np.array([[1,2,3],[3,4,5],[4,5,6]])>>>print(a)[[1 2 3] [3 4 5] [4 5 6]]

> 简单:

>>> a[1]

array([3, 4, 5])

单个参数的话,就是指的是1,第⼆⾏或第⼆列。这⾥是⾏,因为⾏优先我猜。所以就是第2⾏的元素

>>> a[1:]

array([[3, 4, 5], [4, 5, 6]])

出现了冒号,意思是从第⼆号到最后,这⾥指的也是⾏。冒号后⾯没有数就是指最⼤的。冒号前⾯没有数,就是指最⼩数0。如下

>>> a[:2]

array([[1, 2, 3], [3, 4, 5]])

这⾥的意思就是,从0开始,到2,也就是第1⾏第⼆⾏。(第三⾏不算)

>>> a[1:2]

array([[3, 4, 5]])

现在是两个参数了,不过只有⼀个冒号:,跟⼀维数组⼀样,是从第⼆⾏到第三⾏,不包括第三⾏。

> 进阶

>>> a[1,]

array([3, 4, 5])>>> a[1:,]

array([[3, 4, 5], [4, 5, 6]])>>> a[:2,]

array([[1, 2, 3], [3, 4, 5]])>>> a[1:2,]array([[3, 4, 5]])

跟上⾯三个对⽐⼀下,发现输出⼀模⼀样。总结:

这是numpy的切⽚操作,⼀般结构如num[a:b,c:d],分析时以逗号为分隔符,

逗号之前为要取的num⾏的下标范围(a到b-1),逗号之后为要取的num列的下标范围(c到d-1);前⾯是⾏索引,后⾯是列索引。

如果是这种num[:b,c:d],a的值未指定,那么a为最⼩值0;

如果是这种num[a:,c:d],b的值未指定,那么b为最⼤值;c、d的情况同理可得。

所以重点就是看逗号,没逗号,就是看⾏了,冒号呢,就看成⼀维数组的形式啦。那上⾯逗号后⾯没有树,也就是不对列操作咯。当然也可以这样:

>>> a[:2:1]array([[1, 2, 3], [3, 4, 5]])

⾸先没有逗号,那切⽚就是只看⾏了,这⾥的意思是,从0开始到2(2不算),间隔为1。

> 进阶up

⾸先先把原数组再看⼀下。

>>> import numpy as np

>>> a = np.array([[1,2,3],[3,4,5],[4,5,6]])>>>print(a)[[1 2 3][3 4 5][4 5 6]]

>>> a[:,1]array([2, 4, 5])

逗号前⾯是⾏,⾏都没有指定数,也就是说对⾏每要求,只考虑列了。这⾥的意思是:逗号之后是列,只有⼀个元素1,就是取第2列了。

>>> a[:,1:3] #第2列到第3列array([[2, 3], [4, 5], [5, 6]])

>>> a[:,0:2] #第1列到第2列array([[1, 2], [3, 4], [4, 5]])

>>> a[:,] #对列也不操作,跟下⾯等价array([[1, 2, 3], [3, 4, 5], [4, 5, 6]])>>> a[:,:]

array([[1, 2, 3], [3, 4, 5], [4, 5, 6]])

但是,下⾯的写法是错的 (就是逗号在最前⾯都是错的)

>>> a[,1]

File \"\ a[,1] ^

SyntaxError: invalid syntax>>> a[,]

File \"\ a[,] ^

SyntaxError: invalid syntax>>> a[,:1]

File \"\ a[,1] ^

SyntaxError: invalid syntax

到这,应该能基本看得懂所有的切⽚操作了吧

但是,我们可能还会遇到负号,⽐如-1、-2…等这些。这些怎么理解呢?看下图

也就是说,-1就是指最后⼀个(⾏/列),依次递推。

> 实战⼀波

>>> a[:,-1] #就是最后⼀列啦array([3, 5, 6])

>>> a[:,-3:] #倒3列,也就是这个数组的第⼀列,⼀直到最后。array([[1, 2, 3], [3, 4, 5], [4, 5, 6]])

>>> a[:,-3:-1] #倒3列,到倒1列,不包括倒⼀列。array([[1, 2], [3, 4], [4, 5]])

其他⾏和列就都差不多啦ok,现在看看稍微难理解的。

> 进阶upup

对⽐⼀下下⾯两个,发现他们的维度不同,⼀个是⼀维的,⼀个是⼆维的。我们上⾯也遇到⼀个,⼀个是⼀维,⼀个是具体的单个元素。

>>> a[:,-1]array([3, 5, 6])

>>> a[:,-1:]array([[3], [5], [6]])

我的理解:

第⼀个是,指定了最后⼀列,也就是说,在⼆维数组⾥的⼀列,就是⼀维的啊。那么第⼆个,是从最后⼀列开始,不妨假设⼀下后⾯还有列,那么就应该是不⽌⼀列,对机器来说,就是⼆维的。机器肯定不知道什么时候是⼀维,什么时候是⼆维的,所以当你⽤到start和stop的时候,那就当作是⼆维的了。我的建议:

官⽹给出的教程实在是太简洁了。不够详细,所以啊,还是要⾃⼰动动⼿,就能很快明⽩numpy数组的切⽚操作了。

注;以上就是博主能想到的所以切⽚操作了吧,关于我的理解,如果有误的话,还请⼤佬指出,共同学习呀。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务