Numpy数组的三种主要索引方式讲解及源码示例

devtools/2024/12/23 14:50:13/

1、整数索引和切片

NumPy中可以通过整数索引和切片来访问和修改数组中的元素,数组的维度不同、整数索引和切片的用法也会有所不同。 对于一维数组来说,整数索引和切片的用法与Python列表中索引和切片的用法相同;对于二维数组来说,整数索引和切片的用法要复杂一些。下面以二维数组为例,演示如何使用整数索引和切片访问数组的元素。

(1)如果希望获取二维数组的一行元素,则可以通过“数组[行索引]”的形式实现,示例代码如下 :

python">
>>> import numpy as np
>>> arr2d=np.array([[1,6,11,16,21],[2,7,12,17,22],[3,8,13,18,23],[4,9,14,19,24], [5,10,15,20,25]])
>>> arr2d
array([[ 1,  6, 11, 16, 21],[ 2,  7, 12, 17, 22],[ 3,  8, 13, 18, 23],[ 4,  9, 14, 19, 24],[ 5, 10, 15, 20, 25]])
>>> arr2d[2]  #共获取行索引为2的整行元素
输出:array([ 3,  8, 13, 18, 23])

(2)如果希望获取二维数组的单个元素,则需要通过“数组[行索引,列索引]”的形式实现。 例如,获取位于第3行第4列的元素,示例代码如下:

python">
>>> arr2d[2,3] #获取行索引为2、列索引为3的元素
输出:18

(3)如果希望获取二维数组的多行元素,则可以通过“数组[行索引的切片]”的形式实现,示例代码如下 :

python">
>>> arr2d[:2]  #获取索引为0、1的两行元素,截止到2且不包含2
输出:array([[ 1,  6, 11, 16, 21],[ 2,  7, 12, 17, 22]])

(4)如果希望获取二维数组的部分元素,则可以通过“数组[行索引的切片,列索引的切片]” 的形式实现,示例代码如下:

python">
>>> arr2d[:2,:2] #获取行索引为0~1、列索引为0~1的部分元素,
输出:array([[1, 6],[2, 7]])

(5)此外,也可以混合使用切片与整数索引,通过这种方式访问二维数组的部分元素,示例代码如下:

python">>>> arr2d[:,2]  #获取列索引为2的整列元素,此时行不限制
输出:array([11, 12, 13, 14, 15])

2、花式索引

花式索引是NumPy的一个术语,是指用整数数组或整数列表作为索引。若花式索引操作的目标对象是一维数组,则会把花式索引的每个整数作为索引,通过索引获取相应位置的元素;若花式索引操作的目标对象是二维数组,则通过花式索引获取的结果是一行或多行元素。

通俗理解:花式索引就像是给数组里的元素排队,然后用一个特殊的名单(整数数组或列表)来挑选出你想要的那些元素。如果数组是一排人的话,花式索引就像是按照名单顺序点名字,点到谁,谁就出列。对于一维数组来说,就像是直接点一个人的名字;而对于二维数组,则像是点了一群人的名字,可能是整排的人,也可能是从不同排里挑出的人。简单来说,花式索引就是按照你的名单,从数组中精确地取出你想要的元素。

接下来以一维数组为例,演示如何使用花式索引访问一维数组的部分元素,具体代码如下:

python">
>>> arr=np.array([10,6,5,11,18,16,9,0,3,20])
>>> arr[[0,1,5]]
输出:array([10,  6, 16])

上述代码中,通过花式索引[0,1,5]访问一维数组arr,分别获取索引0、1、5对应的元素。 从上述结果中可以看出,程序输出了一个新数组,该数组中的元素是10、6、16。

下面二维数组arr2d为例,演示如何使用花式索引访问二维数组的元素, 具体代码如下:

python">
>>> arr2d[[1,4]]
输出:array([[ 2,  7, 12, 17, 22],[ 5, 10, 15, 20, 25]])

上述代码中,通过花式索引[1,4]访问二维数组arr2d,依次从二维数组arr2d中获取行索引1、 4对应的元素。从上述结果可以看出,程序输出了二维数组中行索引为1、4对应的两行元素。

如果想要访问二维数组中的部分元素,而不是整行元素,则需要通过两个花式索引完成, 其中第一个花式索引中的整数会被作为行索引,第二个花式索引中的整数会被作为列索引。

当使用两个花式索引操作二维数组时,会按照二维数组的索引方式,依次获取位置相同的行索引和列索引对应的元素,示例代码如下:

python">
>>> arr2d[[1,4],[2,3]]
输出:array([12, 20])

上述代码中,通过两个花式索引[1,4]、[2,3]访问二维数组arr2d,依次从二维数组arr2d中获取行索引1、列索引2对应的元素和行索引4、列索引3对应的元素。

需要注意的是,当使用两个花式索引访问二维数组时,两个花式索引对应数组或列表的长度是相等的,并且长度不能超过二维数组中相应轴上的元素数量,否则会出现索引异常。

3、步尔索引

布尔索引指的是将一个布尔数组布尔列表作为数组索引。当使用布尔索引访问数组时,会将数组中与布尔数组或布尔列表位置相同的元素进行匹配,并返回与布尔数组或布尔列表中True位置对应的元素。注意,布尔数组或布尔列表的长度必须与被索引轴的长度一致。

值得一提的是,布尔数组可以是手动创建的,也可以是数组与某个数通过比较运算符或逻辑运算符进行运算后的结果。

假设现在有一个存储了学生数学成绩的数组,若我们需要筛选出分数大于80的语文成绩,则可以先通过比较运算符得到数组与80进行运算后生成的一个布尔数组,再把布尔数组作为布尔索引,只要布尔值为True,就获取True对应位置的元素,示例代码如下:

python">>>> student_score =np.array([[79,88,80],[89,90,92],[83,78,85],[78,76,80]])
>>> student_score
array([[79, 88, 80],[89, 90, 92],[83, 78, 85],[78, 76, 80]])
>>> student_score>80
array([[False,  True, False],[ True,  True,  True],[ True, False,  True],[False, False, False]])
>>> student_score[student_score>80]
array([88, 89, 90, 92, 83, 85])

从上述结果中可以看出,程序返回了一个一维数组,该数组中每个元素的值都大于80,说明成功筛选出了分数大于80的数学成绩。

此外,还可以将布尔索引与切片混合使用,示例代码如下:

python">
>>> student_score[[True,False,True,False],:2]
array([[79, 88],[83, 78]])

在上述代码中,通过布尔索引[True,False,True,False]会获取数组中True对应的一行数据,也就是行索引为0、2的两行数据,通过切片会获取两行数据中列索引为0、1的元素。


http://www.ppmy.cn/devtools/144714.html

相关文章

解决git报错:fatal: unable to connect to cache daemon: Unknown error

问题 fatal: unable to connect to cache daemon: Unknown error 这个错误通常是因为 Git 的缓存进程(git-credential-cache--daemon)无法正常工作,或者连接该守护进程时出现了问题。 fatal: unable to connect to cache daemon: Unknown e…

分布式光伏电站气象站

分布式光伏电站气象站是一种集成了光伏发电与气象观测功能的高科技设备,其主要功能体现在以下几个方面: 一、实时监测与记录气象数据 分布式光伏电站气象站能够实时监测和记录光伏电站所在区域的关键气象数据,包括但不限于温度、湿度、风速…

VPN技术-GRE隧道的配置

GRE隧道的配置 1, 在AR1上配置DHCP接口地址池,AR3上配置DHCP全局地址池 2, PC1获取的IP地址为10.10.10.253,PC2获取的IP地址为10.10.30.253 3,通过ip route-static将目的地址为10.10.30.253的流量引入到Tunnel #配…

electron-vite【实战】登录/注册页

效果预览 项目搭建 https://blog.csdn.net/weixin_41192489/article/details/144611858 技术要点 路由默认跳转到登录页 src/renderer/src/router/index.ts routes: [// 默认跳转到登录页{path: /,redirect: /login},...routes]登录窗口的必要配置 src/main/index.ts 中 cons…

arcgisPro将面要素转成CAD多段线

1、说明:正常使用【导出为CAD】工具,则导出的是CAD三维多线段,无法进行编辑操作、读取面积等。这是因为要素面中包含Z值,导出则为三维多线段数据。需要利用【复制要素】工具禁用M值和Z值,再导出为CAD,则得到…

电脑除尘更换cpu和显卡硅脂过程及安装win11系统中遇到的问题

原由 电脑是2022款的显卡TRX3050ti 的Y7000p,在使用过程中发现电脑风扇声音很大,想来也是用很久没有清理过灰尘了,在拆卸视频中发现一个换硅脂的,刚好手头有,想来也没换过,所以就直接换了。但修完后直接打开却出现了无…

JavaScript文件端点提取与安全分析:两种高效实用的方法

提取JS文件中的所有端点(Endpoints) JavaScript文件中包含了大量的信息,对于安全研究人员来说,提取这些文件中的API端点是发现潜在漏洞的重要环节之一。在本篇文章中,我们将介绍两种高效提取JavaScript文件端点的方法。以下方法主要应用于渗透测试场景,尤其是针对目标域…

探索Web3的核心原则:去中心化与用户控制

Web3作为未来互联网的愿景,正逐步改变我们对网络的认知。它的两大核心原则——去中心化和用户控制,不仅推动了技术的革新,也重新定义了互联网用户与平台之间的关系。这些原则的落地,能够让用户在数字世界中拥有更多的自主权、隐私…