zoukankan      html  css  js  c++  java
  • 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数组切片操作之[:,2]、[-1:,0:2]、[1:,-1:]等都是啥?
    https://blog.csdn.net/qq_41375609/article/details/95027651

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

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

     
    我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站: fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
    博主25岁,前端后端算法大数据人工智能都有兴趣。
    大家有啥都可以加博主联系方式(qq404006308,微信fan404006308)互相交流。工作、生活、心境,可以互相启迪。
    聊技术,交朋友,修心境,qq404006308,微信fan404006308
    26岁,真心找女朋友,非诚勿扰,微信fan404006308,qq404006308
    人工智能群:939687837

    作者相关推荐

  • 相关阅读:
    LeetCode题目:Gray Code
    LeetCode题目: Remove Duplicate Letters
    非阻塞socket中read、write返回值
    C连接MySql
    使用GDB调试程序
    C语言中使用库函数解析命令行参数
    把服务器当网盘玩 教你从云服务器下载自己的文件
    微信小程序 地图选点 获取用户选择的定位信息 wx.chooseLocation
    如何避免高不成低不就? 疫情当下Java学习路线分享
    微信小程序 获取手机号 JS
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13873975.html
Copyright © 2011-2022 走看看