zoukankan      html  css  js  c++  java
  • Numpy系列(四)- 索引和切片

    Python 中原生的数组就支持使用方括号([])进行索引和切片操作,Numpy 自然不会放过这个强大的特性。

     单个元素索引

    1-D数组的单元素索引是人们期望的。它的工作原理与其他标准Python序列一样。它是从0开始的,并且接受负索引来从数组的结尾进行索引。

    import numpy as np
    a = np.arange(10)
    a
    Out[130]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    a[3]
    Out[131]: 3
    a[-2]
    Out[132]: 8
    

    与Python原生的列表、元组不同的是,Numpy数组支持多维数组的多维索引。

    a.shape
    Out[133]: (10,)
    a.resize(2, 5)
    a
    Out[135]: 
    array([[0, 1, 2, 3, 4],
           [5, 6, 7, 8, 9]])
    a[0, 1]
    Out[136]: 1
    a[1, 2]
    Out[137]: 7
    a[1]
    Out[138]: array([5, 6, 7, 8, 9])
    a[1][2]
    Out[139]: 7
    

      x[1,-1] 的结果等于 x[1][-1],但是第二种情况效率更低,因为第二种方式创建了一个临时数组。

    切片支持

    可以使用切片和步长来截取不同长度的数组,使用方式与Python原生的对列表和元组的方式相同。

    x = np.arange(10)
    x[2:5]
    Out[140]: array([2, 3, 4])
    x[2:5]
    Out[141]: array([2, 3, 4])
    x[:-2]
    Out[142]: array([0, 1, 2, 3, 4, 5, 6, 7])
    x[1:7:2]
    Out[143]: array([1, 3, 5])
    y = np.arange(35).reshape(5,7)
    y
    Out[144]: 
    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, 32, 33, 34]])
    y[1:5:2,:3]
    Out[145]: 
    array([[ 7,  8,  9],
           [21, 22, 23]])
    y[1:5:2,::3]
    Out[146]: 
    array([[ 7, 10, 13],
           [21, 24, 27]])
    

      注意:使用切片不会复制内部数组数据,但也会生成原始数据的新视图。

    索引数组

    Numpy数组可以被其他数组索引。对于索引数组的所有情况,返回的是原始数据的副本,而不是一个获取切片的视图。

    索引数组必须是整数类型。

    x = np.arange(10,1,-1)
    x
    Out[147]: array([10,  9,  8,  7,  6,  5,  4,  3,  2])
    x[np.array([1,3,4,])]
    Out[148]: array([9, 7, 6])
    

     使用索引数组来对被索引数组进行索引后,会生成一个与索引数组形状相同的新数组,只是这个新数组的值会用被索引数组中对应索引的值替代。

    x[np.array([3, 3, 1, 8])]

     布尔索引数组

    使用(整数)索引列表时,需要提供要选择的索引列表,最后生成的结果形状与索引数组形状相同;但是在使用布尔索引时,布尔数组必须与要编制索引的数组的初始维度具有相同的形状。在最直接的情况下,布尔数组具有相同的形状:

    y
    Out[149]: 
    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, 32, 33, 34]])
    b = y>20
    b
    Out[150]: 
    array([[False, False, False, False, False, False, False],
           [False, False, False, False, False, False, False],
           [False, False, False, False, False, False, False],
           [ True,  True,  True,  True,  True,  True,  True],
           [ True,  True,  True,  True,  True,  True,  True]])
    y[b]
    Out[151]: array([21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34])
    y[y>20]
    Out[152]: array([21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34])

    与整数索引数组的情况不同,在布尔数组中,结果是1-D数组,其包含索引数组中的所有元素,对应于布尔数组中的所有真实元素。索引数组中的元素始终以行优先(C样式)顺序进行迭代和返回。结果也与y[np.nonzero(b)]相同。与索引数组一样,返回的是数据的副本,而不是一个获取切片的视图。

    如果y比b的维数更高,则结果将是多维的。例如:

    b[:,5]
    Out[153]: array([False, False, False,  True,  True])
    y[b[:,5]]
    Out[154]: 
    array([[21, 22, 23, 24, 25, 26, 27],
           [28, 29, 30, 31, 32, 33, 34]])

      结构化索引工具

    为了便于数组形状与表达式和赋值关系的匹配,可以在数组索引中使用np.newaxis对象来添加大小为1的新维。例如

    y.shape
    Out[155]: (5, 7)
    y[:,np.newaxis,:].shape
    Out[157]: (5, 1, 7)
    

      注意,在数组中没有新的元素,只是维度增加。这可以方便地以一种方式组合两个数组,否则将需要明确重塑操作。例如:

    x = np.arange(5)
    x
    Out[158]: array([0, 1, 2, 3, 4])
    x[:,np.newaxis] + x[np.newaxis,:]
    Out[159]: 
    array([[0, 1, 2, 3, 4],
           [1, 2, 3, 4, 5],
           [2, 3, 4, 5, 6],
           [3, 4, 5, 6, 7],
           [4, 5, 6, 7, 8]])
    

      省略语法(三个点)可以用于指示完全选择任何剩余的未指定维度。如果数组z的形状是(3,3,3,3),那么z[1,...,2]等效于z[1,:,:,2]。例如:

    z = np.arange(81).reshape(3,3,3,3)
    z
    Out[160]: 
    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, 32],
             [33, 34, 35]],
            [[36, 37, 38],
             [39, 40, 41],
             [42, 43, 44]],
            [[45, 46, 47],
             [48, 49, 50],
             [51, 52, 53]]],
           [[[54, 55, 56],
             [57, 58, 59],
             [60, 61, 62]],
            [[63, 64, 65],
             [66, 67, 68],
             [69, 70, 71]],
            [[72, 73, 74],
             [75, 76, 77],
             [78, 79, 80]]]])
    z[1,...,2]
    Out[161]: 
    array([[29, 32, 35],
           [38, 41, 44],
           [47, 50, 53]])
    z[1,:,:,2]
    Out[162]: 
    array([[29, 32, 35],
           [38, 41, 44],
           [47, 50, 53]])

      给被索引的数组赋值

    可以使用单个索引,切片,索引和布尔数组来选择数组的子集来分配。分配给索引数组的值必须是形状一致的(相同的形状或可广播到索引产生的形状)。例如,允许为切片分配常量:

    x = np.arange(10)
    x[2:7]
    Out[163]: array([2, 3, 4, 5, 6])
    x[2:7] = np.arange(5)
    x
    Out[164]: array([0, 1, 0, 1, 2, 3, 4, 7, 8, 9])
    

      

     

  • 相关阅读:
    node介绍和环境安装
    有些运算
    时间与日期
    ISE综合工具XST综合约束相关
    Quartus和ISErom文件格式
    IC设计流程及工具
    PAD PIN
    SQL SERVER 2008 利用发布订阅方式实现数据库同步
    .NET中,写一个函数找出一个整数数组中,第二大的数(整数数组作为函数参数)
    网络嵌入式设备
  • 原文地址:https://www.cnblogs.com/zhangyafei/p/10567123.html
Copyright © 2011-2022 走看看