数组索引是指使用中括号 [] 来定位数据元素,不仅可以定位到单个元素,也可以定位到多个元素。索引基于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 索引

NumPy 学习 第二篇:索引和切片的更多相关文章

  1. Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍

    Java并发包下锁学习第二篇队列同步器 还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图: ​ 从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本 ...

  2. Java泛型学习---第二篇

    泛型学习第一篇 1.泛型之擦拭法 泛型是一种类似"模板代码"的技术,不同语言的泛型实现方式不一定相同. Java语言的泛型实现方式是擦拭法(Type Erasure). 所谓擦拭法 ...

  3. Numpy数组基本操作(数组索引,数组切片以及数组的形状,数组的拼接与分裂)

    一:数组的属性 每个数组都有它的属性,可分为:ndim(数组的维度),shape(数组每个维度的大小),size(数组的总大小),dtype(数组数据的类型) 二:数组索引 和python列表一样,N ...

  4. 从.Net到Java学习第二篇——IDEA and start spring boot

    从.Net到Java学习第一篇——开篇 所谓工欲善其事,必先利其器,做java开发也一样,在比较了目前最流行的几个java IDE(eclipse,myeclipse.IDEA)之后,我果断选择IDE ...

  5. Python 学习 第二篇:数据类型(字符串)

    字符串是一个字符的.有序的.不可变的序列,用于存储基于文本的信息.字符串所包含的字符存在从左至右的位置顺序,不可以在原处(in-place)修改.Python没有C语言的字符和字符串之分,只有字符串. ...

  6. Golang学习-第二篇 搭建一个简单的Go Web服务器

    序言 由于本人一直从事Web服务器端的程序开发,所以在学习Golang也想从Web这里开始学起,如果对Golang还不太清楚怎么搭建环境的朋友们可以参考我的上一篇文章 Golang的简单介绍及Wind ...

  7. Android基础学习第二篇—Activity

    写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...

  8. LINQ查询操作符 LINQ学习第二篇[转]

    一.投影操作符 1. Select Select操作符对单个序列或集合中的值进行投影.下面的示例中使用select从序列中返回Employee表的所有列: using (NorthwindDataCo ...

  9. [dart学习]第二篇:dart变量介绍 (一)

    前言 本文的所有内容均是官方文档的简单翻译和理解,需要查看原文,请登录  https://www.dartlang.org/guides/language/language-tour  阅读, 让我们 ...

随机推荐

  1. javascript中的toString()

    基本介绍 javascript中的toString方法是我们在写前端时经常要用的一个函数,也就是将我们的变量转换成字符串的方法. javascript中各种类型的toString方法 javascri ...

  2. 深入理解 Java 注解

    深入理解 Java 注解 本文内容基于 JDK8.注解是 JDK5 引入的,后续 JDK 版本扩展了一些内容,本文中没有明确指明版本的注解都是 JDK5 就已经支持的注解.

  3. selenium设置谷歌无头浏览器

    from selenium import webdriver from selenium.webdriver.chrome.options import Options def Browse(): c ...

  4. PlayJava Day016

    今日所学: /* 2019.08.19开始学习,此为补档. */ 数组 1.一维数组:数据类型[ ] 变量名 = new 数据类型[长度] 获取长度:array.length 在使用下标时确保不超过a ...

  5. linux指令大全(归类整理)

    一.文件目录指令 1 pwd指令 pwd 显示当前所在的目录 2 ls指令 ls [选项] [目录或文件] 查看文件信息 ls -a 查看所有文件和目录,包括隐藏的 ls -l 以列表的方式显示 ll ...

  6. flex下省略号的问题解决

    最近在搞微信小程序,发现flex下使用省略号是没有效果的,而且还会打乱预期的结构,查询statckoverflow知道需要在父级设置min-width:0; 但是在我的尝试下,依然不行,原来在上层父级 ...

  7. 应用InstallShield 2015打包软件打包C#程序

    大家都明白,程序员写出的程序与用户直接使用的程序之间还有一个简单的环节,就是打包.今天就简单介绍下用InstallShield 2015打包工具进行程序的打包, 有兴趣的可以看看! 首先前面安装打包工 ...

  8. Cesium专栏-空间分析之剖面分析(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  9. 读取property配置的N种方式

    @Value注解 @Value("${ddd}") <!-- 加载配置属性文件 --> <context:property-placeholder ignore- ...

  10. jmeter控制器(四)

    交替控制器: 交替控制器主要是让控制器里面的请求顺序执行,如下图设置了审批管理循环3次,那么第一次运行就执行了请假模块,第二次运行执行了请假模块1,第二次执行了请加模块2,依顺序每一个请加模块只执行一 ...