zoukankan      html  css  js  c++  java
  • NumPy 学习 第二篇:索引和切片

    数组索引是指使用中括号 [] 来定位数据元素,不仅可以定位到单个元素,也可以定位到多个元素。索引基于0,并接受从数组末尾开始索引的负索引。

    举个例子,正向索引从0开始,从数组开始向末尾依次加1递增;负向索引从-1开始,逐个元素 -1 ,不管使用正向索引还是负向索引,最右侧的元素的索引值是最大的,最左侧的元素的索引值是最小的。

    >>> x = np.arange(10)
    >>> x[2]
    2
    >>> x[-2]
    8

    一,单个元素的索引

    ndarray对象的元素可以通过索引来访问和修改,索引基于0。要定位到单个元素,对于一维数组,只需要一个索引;对于二维数组,需要两个维度的索引。

    1,一维数组的索引

    一维数组最简单,只有一个维度,中括号中只有一个索引idx,正向索引idx 从0开始,负向索引从-1开始:

    arr = np.arange(10)
    
    arr[idx]

    2,二维数组的索引

    在一个二维数组中,一个索引位置上的元素不再是标量,而是一维数组。要索引到单个标量元素,需要在中括号中分别指定行维度和列维度的索引,索引都是从0开始:

    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

    对于更高维度的数组,一个中括号表示一个维度,索引的使用依此类推。

    二,数组的切片

    数组的切片是Python基本切片的概念从一维到N维的扩展,通过中括号,start,stop和step参数提供给内置函数的slice函数来构造一个Python slice对象,把slice对象传递给数组,提取数组的一部分。

    1,切片的格式

    切片的格式是[start:end:step],如果省略start,使用start的默认值0;如果省略end,那么end的默认值是 维度长度-1;如果省略step,使用step的默认值1。通常情况下,数组的切片是[start:end],这就意味着使用step的默认值1。

    arr = np.array(n)
    arr[start:end]
    arr[start:end:step]

    2,浅拷贝(视图)

    数组切片是原始数组的浅拷贝,也叫视图,修改切片中的原始,会直接修改原始数据。

    对于一维数组,数组切片上的任何修改都会直接修改原始数组:

    arr = np.arange(10)
    arr_slice=arr[5:8]
    arr_slice[1]=111
    #arr=array([0,1,2,3,4,5,111,7,8,9])
    
    arr_slice[:]=222
    #arr=array([0,1,2,3,4,222,222,222,8,9])

    对于二维数组,一个中括号表示一个维度,依此类推。

    >>> y = np.arange(35).reshape(5,7)
    >>> y[1:5:2,::3]
    array([[ 7, 10, 13],
           [21, 24, 27]])

    4,深拷贝(副本)

    调用copy()方法对数组创建一个深拷贝,也叫副本,深拷贝是生成数组及其数据的完整副本。

    例如,b是a的深拷贝,修改数组a不会影响数组b:

    b = a.copy()

    三,索引数组

    NumPy数组可以使用其他数组(或任何其他可以转换为数组的类似序列的对象,如列表,除元组之外的索引)作为索引。对于索引数组的所有情况,返回的是原始数据的副本(深拷贝),而不是切片获取的视图。

    索引数组必须是整数类型。数组中的每个值指示要使用的数组中的哪个值代替索引:

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

    由值3,3,1和8组成的索引数组相应地创建一个长度为4的数组(与索引数组相同),其中每个索引由索引数组在被索引的数组中具有的值替换。

    允许使用负值,并且与单个索引或切片一样工作:

    >>> x[np.array([3,3,-3,8])]
    array([7, 7, 4, 2])

    一般来说,使用索引数组时返回的是与索引数组具有相同形状的数组,但索引的数组的类型和值。作为示例,我们可以使用多维索引数组:

    >>> x[np.array([[1,1],[2,3]])]
    array([[9, 9],
           [8, 7]])

    四,掩码索引数组

    如果索引数组的元素类型是布尔,把该索引数组称作布尔或掩码索引数组。整数索引数组,元素是数组的索引值,而对于掩码索引数组,元素值是True或False,掩码索引数组和数据数组的形状相同,一个掩码索引对应一个数据数组的元素。当掩码为True时,选择该位置对应的元素;当掩码为False,忽略该位置对应的元素。

    >>> b = y>20
    >>> y[b]
    array([21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34])

    参考文档:

    NumPy 索引

  • 相关阅读:
    Redis开发与运维:SDS
    Redis开发与运维:数据迁移
    我的2019上半年
    C# 并发编程
    经典排序算法 — C# 版(上)
    图解 -- 树的汇总
    图解--队列、并发队列
    栈到CLR
    我们的数组
    算法复杂度
  • 原文地址:https://www.cnblogs.com/ljhdo/p/10275607.html
Copyright © 2011-2022 走看看