美文网首页
7-Python-NumPy切片和索引

7-Python-NumPy切片和索引

作者: 千千罐 | 来源:发表于2020-10-16 09:12 被阅读0次
    1、通过内置的 \color{red}{slice} 函数进行切片
    >>> import numpy as np
    >>> a = np.arange(10)
    >>> s = slice(2,7,2)                 # 从索引 2 开始到索引 7 停止,间隔为2
    >>> a[s]
    array([2, 4, 6])
    
    >>> np.arange(10)[slice(2,7,2)]
    array([2, 4, 6])
    
    2、直接通过 \color{red}{:} 进行切片,用法同Python对List的操作,这里不再重复

    一维数组

    >>> a = np.arange(10) 
    >>> a
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    >>> a[2:7:2]
    array([2, 4, 6])
    

    多维数组

    >>> b = np.array([[1,2,3],[3,4,5],[4,5,6]])
    >>> b
    array([[1, 2, 3],
           [3, 4, 5],
           [4, 5, 6]])
    >>> b[1]
    array([3, 4, 5])
    
    3、多维数组 还可以 使用 \color{red}{...} 来进行切片

    ... 代表行或列的全部元素

    >>> b = np.array([[1,2,3],[3,4,5],[4,5,6]])
    array([[1, 2, 3],
           [3, 4, 5],
           [4, 5, 6]])
    
    ''' 第二列 '''
    >>> b[...,1]
    array([2, 4, 5])
    
    ''' 第二行 '''
    >>> b[1,...]
    array([3, 4, 5])
    
    ''' 所有行的第二列至最后一列元素'''
    >>> b[...,1:]
    array([[2, 3],
           [4, 5],
           [5, 6]])
    
    ''' [...,...]是不可取的 '''
    >>> b[...,...]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: an index can only have a single ellipsis ('...')
    
    4、高级索引
    4.1、整数数组索引

    先要确定需要获取的元素的索引,将行索引和列索引分别组合在一起即可

    获取数组中(0,0),(1,1)和(2,0)位置处的元素,那行就应该是[0,1,2],列是[0,1,0]

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

    单独获取行和列,再合并

    >>> x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
    >>> x
    array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 6,  7,  8],
           [ 9, 10, 11]])
    
    >>> rows = np.array([[0,0],[3,3]]) 
    >>> rows
    array([[0, 0],
           [3, 3]])
    
    >>> cols = np.array([[0,2],[0,2]]) 
    >>> cols
    array([[0, 2],
           [0, 2]])
    
    >>> x[rows,cols]  
    array([[ 0,  2],
           [ 9, 11]])
    

    借助切片 : 或 … 与索引数组组合

    >>> a = np.array([[1,2,3], [4,5,6],[7,8,9]])
    >>> a
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    
    >>> a[1:3, 1:3]
    array([[5, 6],
           [8, 9]])
    
    >>> a[1:3,[1,2]]
    array([[5, 6],
           [8, 9]])
    
    4.2、布尔索引

    通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组

    保留大于5的元素

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

    去掉NaN元素

    ''' 一维数组 '''
    a = np.array([np.nan,1,2,np.nan,3,4,5])  
    >>> a
    array([nan,  1.,  2., nan,  3.,  4.,  5.])
    >>> a[~np.isnan(a)]
    array([1., 2., 3., 4., 5.])
    
    ''' 二维数组 '''
    >>> a = np.array([[np.nan,1,2],[np.nan,4,5]])  
    >>> a
    array([[nan,  1.,  2.],
           [nan,  4.,  5.]])
    >>> a[~np.isnan(a)]
    array([1., 2., 4., 5.])
    

    保留值复数的元素

    >>> a = np.array([1,  2+6j,  5,  3.5+5j]) 
    >>> a[np.iscomplex(a)]
    array([2. +6.j, 3.5+5.j])
    

    结果会生成一个满足比较条件后的元素组成的一维数组

    4.3、花式索引

    根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行

    提取数组的第4,2,1,7行,结果会生成一个4行列数和原数组相同的数组。

    >>> x=np.arange(32).reshape((8,4))
    >>> x
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15],
           [16, 17, 18, 19],
           [20, 21, 22, 23],
           [24, 25, 26, 27],
           [28, 29, 30, 31]])
    >>> x[[4,2,1,7]]
    array([[16, 17, 18, 19],
           [ 8,  9, 10, 11],
           [ 4,  5,  6,  7],
           [28, 29, 30, 31]])
    

    也可以进行倒叙取值

    >>> x[[-4,-2,-1,-7]]
    array([[16, 17, 18, 19],
           [24, 25, 26, 27],
           [28, 29, 30, 31],
           [ 4,  5,  6,  7]])
    

    行和列同时取值

    >>> x[np.ix_([1,5,7,2],[0,3,1,2])]
    array([[ 4,  7,  5,  6],
           [20, 23, 21, 22],
           [28, 31, 29, 30],
           [ 8, 11,  9, 10]])
    >>> x[np.ix_([1,5,7,2],[0,3,1,])]
    array([[ 4,  7,  5],
           [20, 23, 21],
           [28, 31, 29],
           [ 8, 11,  9]])
    

    转:https://www.runoob.com/numpy/numpy-advanced-indexing.html

    相关文章

      网友评论

          本文标题:7-Python-NumPy切片和索引

          本文链接:https://www.haomeiwen.com/subject/jtanpktx.html