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

    作者相关推荐

  • 相关阅读:
    10 个雷人的注释,就怕你不敢用!
    Java 14 之模式匹配,非常赞的一个新特性!
    poj 3661 Running(区间dp)
    LightOJ
    hdu 5540 Secrete Master Plan(水)
    hdu 5584 LCM Walk(数学推导公式,规律)
    hdu 5583 Kingdom of Black and White(模拟,技巧)
    hdu 5578 Friendship of Frog(multiset的应用)
    hdu 5586 Sum(dp+技巧)
    hdu 5585 Numbers
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13873975.html
Copyright © 2011-2022 走看看