博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
numpy数组切片操作之[:,2]、[-1:,0:2]、[1:,-1:]等都是啥?
阅读量:3905 次
发布时间:2019-05-23

本文共 3138 字,大约阅读时间需要 10 分钟。

注:最近在看代码,有好多关于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 "
", line 1 a[,1] ^SyntaxError: invalid syntax>>> a[,] File "
", line 1 a[,] ^SyntaxError: invalid syntax>>> a[,:1] File "
", line 1 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数组的切片操作了。

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

转载地址:http://ljxen.baihongyu.com/

你可能感兴趣的文章
449. 序列化和反序列化二叉搜索树
查看>>
450. 删除二叉搜索树中的节点
查看>>
451. 根据字符出现频率排序
查看>>
454. 四数相加 II
查看>>
467. 环绕字符串中唯一的子字符串
查看>>
468. 验证IP地址
查看>>
474. 一和零
查看>>
486. 预测赢家
查看>>
494. 目标和
查看>>
520. 检测大写字母
查看>>
数据处理和训练模型的技巧
查看>>
vb 中如何做同步 异步?
查看>>
geturl
查看>>
关于sizeof
查看>>
windows 核心编程笔记.070301
查看>>
WINDOWS核心编程笔记 070303
查看>>
终于解决了交叉表左上角,每页都显示的问题.
查看>>
windows核心编程 070309
查看>>
哈,又解决水晶报表的一个难题
查看>>
VC Ini文件处理
查看>>