zoukankan      html  css  js  c++  java
  • numpy数组的索引和切片

    numpy数组的索引和切片

    基本切片操作

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

    切片赋值操作

    1.切片赋一个值对应原来数组中的值也会变

    >>> arr[5:8]=12
    >>> arr
    array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])
    
    >>> import numpy as np
    >>> arr=np.arange(10)
    >>> arr_slice=arr[5:8]
    >>> arr_slice[0]=-1
    >>> arr_slice
    array([-1,  6,  7])
    >>> arr
    array([ 0,  1,  2,  3,  4, -1,  6,  7,  8,  9])
    

    2.给数组中所有元素赋值

    >>> arr[:]=-1
    >>> arr
    array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])
    

    3.如果想使用复制的方法,使用copy方法

    >>> arr_copy=arr[:].copy()
    >>> arr_copy
    array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])
    >>> arr_copy[:]=0
    >>> arr_copy
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
    >>> arr
    array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])
    

    高阶数组索引

    >>> import numpy as np
    >>> arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
    >>> arr2d[2]
    array([7, 8, 9])
    >>> arr2d[0][2]
    3
    >>> arr2d[0,2]
    3
    

    >>> import numpy as np
    >>> arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
    >>> arr2d[2]
    array([7, 8, 9])
    >>> arr2d[0][2]
    3
    >>> arr2d[0,2]
    3
    >>> arr3d=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
    >>> arr3d
    array([[[ 1,  2,  3],
            [ 4,  5,  6]],
    
           [[ 7,  8,  9],
            [10, 11, 12]]])
    >>> arr3d[0]
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> old_values=arr3d[0].copy()
    >>> arr3d[0]=42
    >>> arr3d
    array([[[42, 42, 42],
            [42, 42, 42]],
    
           [[ 7,  8,  9],
            [10, 11, 12]]])
    >>> arr3d[1,0]
    array([7, 8, 9])
    >>> x=arr3d[1]
    >>> x
    array([[ 7,  8,  9],
           [10, 11, 12]])
    >>> x[0]
    array([7, 8, 9])
    

    高维数组切片

    >>> arr2d[:2]
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> arr2d[:2,1:]
    array([[2, 3],
           [5, 6]])
    >>> arr2d[1,:2]
    array([4, 5])
    >>> arr2d[:2,2]
    array([3, 6])
    >>> arr2d[:,:1]
    array([[1],
           [4],
           [7]])
    

    布尔型索引

    1.假设我们有一个用于存储数据的数组以及一个存储姓名的数组(含有重复项)。在这里,我将使用numpy.random中的randn函数生成一些正态分布的随机数据:

    >>> import numpy as np
    >>> names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
    >>> data=np.random.randn(7,4)#7行4列正太分布随机数组
    >>> names
    array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')
    >>> data
    array([[ 0.24724057,  2.86939948, -0.82061782, -0.65745818],
           [-0.98602372, -0.69305692, -1.44431904, -0.85490816],
           [-0.73613349,  0.12700976, -1.00588979,  1.10646269],
           [ 1.59110894,  1.68597758,  0.39414277,  2.02308399],
           [-1.05607115, -0.50354292, -0.65820553, -0.77610316],
           [ 1.72237936, -0.07726577,  1.63462647, -0.41943148],
           [ 0.66744687, -1.01756773, -0.59254343,  0.19080575]])
    

    2.假设每个名字都对应data数组中的一行,而我们想要选出对应于名字"Bob"的所有行。跟算术运算一样,数组的比较运算(如==)也是矢量化的。因此,对names和字符串"Bob"的比较运算将会产生一个布尔型数组:

    >>> names=='Bob'
    array([ True, False, False,  True, False, False, False])
    

    3.布尔数组可以用于数组的索引

    获取等于'Bob'的行

    >>> data[names=='Bob']
    array([[ 0.24724057,  2.86939948, -0.82061782, -0.65745818],
           [ 1.59110894,  1.68597758,  0.39414277,  2.02308399]])
    

    获取不同于'Bob'的行

    >>> data[names!='Bob']
    array([[-0.98602372, -0.69305692, -1.44431904, -0.85490816],
           [-0.73613349,  0.12700976, -1.00588979,  1.10646269],
           [-1.05607115, -0.50354292, -0.65820553, -0.77610316],
           [ 1.72237936, -0.07726577,  1.63462647, -0.41943148],
           [ 0.66744687, -1.01756773, -0.59254343,  0.19080575]])
    

    4.对布尔索引进行列索引

    >>> data[names=='Bob',2:]
    array([[-0.82061782, -0.65745818],
           [ 0.39414277,  2.02308399]])
    >>> data[names=='Bob',3]
    array([-0.65745818,  2.02308399])
    

    5.反转条件符

    >>> cond=names=='Will'
    >>> cond
    array([False, False,  True, False,  True, False, False])
    >>> data[~cond]
    array([[ 0.24724057,  2.86939948, -0.82061782, -0.65745818],
           [-0.98602372, -0.69305692, -1.44431904, -0.85490816],
           [ 1.59110894,  1.68597758,  0.39414277,  2.02308399],
           [ 1.72237936, -0.07726577,  1.63462647, -0.41943148],
           [ 0.66744687, -1.01756773, -0.59254343,  0.19080575]])
    

    6.布尔条件的运算

    除此之外,连接符还有|、&之类

    >>> mask=(names=='Bob')|(names=='Will')
    >>> mask
    array([ True, False,  True,  True,  True, False, False])
    >>> data[mask]
    array([[ 0.24724057,  2.86939948, -0.82061782, -0.65745818],
           [-0.73613349,  0.12700976, -1.00588979,  1.10646269],
           [ 1.59110894,  1.68597758,  0.39414277,  2.02308399],
           [-1.05607115, -0.50354292, -0.65820553, -0.77610316]])
    

    7.条件选取

    普通条件选取

    >>> data[data<0]=0
    >>> data
    array([[0.24724057, 2.86939948, 0.        , 0.        ],
           [0.        , 0.        , 0.        , 0.        ],
           [0.        , 0.12700976, 0.        , 1.10646269],
           [1.59110894, 1.68597758, 0.39414277, 2.02308399],
           [0.        , 0.        , 0.        , 0.        ],
           [1.72237936, 0.        , 1.63462647, 0.        ],
           [0.66744687, 0.        , 0.        , 0.19080575]])
    

    布尔条件选取

    >>> import numpy as np
    >>> names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
    >>> data=np.random.randn(7,4)#7行4列正太分布随机数组
    >>> data
    array([[-1.24077681, -0.48320904,  1.22145611,  0.00666619],
           [-0.65078721, -0.03482355,  1.74232625,  0.2979584 ],
           [-1.51669752,  2.04245014,  0.09453898, -0.85531867],
           [-1.51334497,  0.36947066, -0.87016919,  1.35107873],
           [-1.11285867, -2.20906849,  0.38269412,  1.85375798],
           [ 0.95132554, -1.54193589,  1.98741745, -0.60608077],
           [ 0.78902133,  1.41593836,  0.09430052, -0.25057659]])
    >>> data[names!='Joe']=7
    >>> data
    array([[ 7.        ,  7.        ,  7.        ,  7.        ],
           [-0.65078721, -0.03482355,  1.74232625,  0.2979584 ],
           [ 7.        ,  7.        ,  7.        ,  7.        ],
           [ 7.        ,  7.        ,  7.        ,  7.        ],
           [ 7.        ,  7.        ,  7.        ,  7.        ],
           [ 0.95132554, -1.54193589,  1.98741745, -0.60608077],
           [ 0.78902133,  1.41593836,  0.09430052, -0.25057659]])
    >>> 
    

    花式索引

    1.传入单个索引数组

    >>> import numpy as np
    >>> arr=np.empty((8,4))#创建8行4列内容为随机值的数组
    >>> arr
    array([[2.65577744e-260, 7.70858946e+218, 6.01334668e-154,
            4.47593816e-091],
           [7.01413727e-009, 2.96905203e+222, 2.11672643e+214,
            4.56532297e-085],
           [4.78409596e+180, 2.44001263e-152, 2.45981714e-154,
            6.83528875e+212],
           [6.14829725e-071, 1.05161522e-153, 1.05135742e-153,
            2.43902457e-154],
           [4.83245960e+276, 6.03103052e-154, 7.06652000e-096,
            2.65862875e-260],
           [1.76380220e+241, 2.30576063e-310, 9.80013217e+040,
            1.55850644e-312],
           [1.33360318e+241, 4.09842267e-310, 2.48721655e-075,
            1.04922745e-312],
           [1.91217285e-309, 1.18182126e-125, 6.57144273e-299,
            5.54240979e-302]])
    >>> for i in range(8):
    	arr[i]=i
    
    >>> arr
    array([[0., 0., 0., 0.],
           [1., 1., 1., 1.],
           [2., 2., 2., 2.],
           [3., 3., 3., 3.],
           [4., 4., 4., 4.],
           [5., 5., 5., 5.],
           [6., 6., 6., 6.],
           [7., 7., 7., 7.]])
    >>> arr[[4,3,0,6]]#选特定的索引下标,选取第4,3,0,6行
    array([[4., 4., 4., 4.],
           [3., 3., 3., 3.],
           [0., 0., 0., 0.],
           [6., 6., 6., 6.]])
    >>> arr[[-3,-5,-7]]#选择特定的索引下标,选取第-3,-5,-7列
    array([[5., 5., 5., 5.],
           [3., 3., 3., 3.],
           [1., 1., 1., 1.]])
    

    2.传入多个索引数组

    >>> arr=np.arange(32).reshape((8,4))
    >>> arr
    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]])
    >>> arr[[1,5,7,2],[0,3,1,2]]#选取(1,0),(5,3),(7,1),(2,2)对应元素
    array([ 4, 23, 29, 10])
    
    >>> arr[[1,5,7,2]][:,[0,3,1,2]]#先选取第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]])
    
  • 相关阅读:
    一线架构师实践指南阅读体会_需求之于架构
    Multi-modal Sentence Summarization with Modality Attention and Image Filtering 论文笔记
    开始用PyTorch
    【微软大法好】VS Tools for AI全攻略(4)——选择适合自己的虚拟机
    【零基础】【Fungus首个中文教程】10分钟快速构建Unity中的万能对话系统 / 叙事系统 / 剧情系统
    Unity使用脚本进行批量动态加载贴图
    【转】Python处理wave文件
    让linux远程主机在后台运行脚本
    【bug清除】新Surface Pro使用OneNote出现毛刺现象的解决方案
    【bug清除】Surface Pro系列使用Drawboard PDF出现手写偏移、卡顿、延迟现象的解决方式
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/11616869.html
Copyright © 2011-2022 走看看