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

news/2024/12/23 6:29:35/

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/news/1557393.html

相关文章

k8s-1.28.1证书更新到100年-cenots7.9

一、查看信息 # cat /etc/redhat-release # kubeadm version k8s环境是通过kubeadm进行安装的。 二、安装依赖工具 # yum groupinstall "Development Tools" -y # yum install gcc make -y # yum install rsync jq -y 三、下载相应版本的k8s包 ## 下载地址&…

迅为RK3576开发板接口丰富4G/5G、wifi6、多网口、NPU等

典型应用方向iFPD、工业控制及网关、云终端、人脸识别设备、车载中控、商显主要特性 ARM 64位高性能八核通用处理器,丰富的PCIE/USB3.0/SATA/GMAC等各类高速及CAN FD/DSMC/UART/SPI/I2C/I3C等低速扩展接口,计算及扩展能力通用性强,一个平台可…

Houdini abc 导入 maya uv无法识别

参考:Houdini导出abc 至maya UV 无法识别_houdini导出abc没有uv-CSDN博客 从maya导入到houdini的uv默认是vertex层级的,而在maya中,uv是在point层级的;因此在houdini中导出abc时应将uv转为点层级,使用vertexsplit节点&…

开源轮子 - EasyExcel01(核心api)

EasyExcel01 - 核心api 本文整理自掘金大佬 - 竹子爱熊猫 https://juejin.cn/post/7405158045662576640 文章目录 EasyExcel01 - 核心api一:初相识EasyExcel1:写入excel入门2:读取Excel入门 二:数据模型注解1:读写通用…

Docker的容器编排

目录 1. 什么是容器编排(Docker Compose)2. 容器编排的功能3. 容器编排文件(docker-compose.yml)的介绍3.1 文件语法版本3.2 文件基本结构及常见指令 4. Docker Compose命令详解4.1 Docker Compose命令清单4.2 命令格式和常见选项…

VSCode中的Black Formatter没有生效的解决办法

说明 如果正常按照配置进行的话,理论上是可以生效的。 "[python]": {"editor.defaultFormatter": "ms-python.black-formatter","editor.formatOnSave": true }但我在一种情况下发现不能生效,应为其本身的bug…

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

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

使用 NVIDIA DALI 计算视频的光流

引言 光流(Optical Flow)是计算机视觉中的一种技术,主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场,广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…