Python中二维数据(数组、列表)索引和切片的Bug

Python中有关数据结构索引和切片引起的Bug

  • 一维数据索引和切片
    • 一维数组
    • 一维列表
  • 二维数据的索引和切片
    • 二维数组
    • 二维(错误)列表

一维数据索引和切片

一维数组

对于一维数据进行索引和切片操作,大家都比较熟悉通过下面代码进行实现

import numpy as np
data = np.random.randn(5)
print(data)
print(data[2:5])  #一维数组切片操作,获取索引2到4的数据
print(data[3])   #一维数组索引操作,获取索引为3的数据

在这里插入图片描述

一维列表

对于一维列表元组等相关结果的索引和切片操作,与一维数组类似

ls = [1, 2, 3, 4, 5]
print(ls)
print(ls[3:5]) #一维列表切片操作,获取索引2到4的数据
print(ls[3])  #一维列表索引操作,获取索引为3的数据

在这里插入图片描述

二维数据的索引和切片

对于二维数据的索引和切片就有一些需要注意的事项了,如果一不小心可能会出现意料之外的Bug

二维数组

import numpy as np
data = np.random.randn(55)
print(data)
print(data[1:3, 2:4])  #二维数组切片操作,获取索引1到2行2到3列的数据
print(data[3, 2])   #二维数组索引操作,获取索引为3行2列的数据
print(data[3][2])   #二维数组索引操作,获取索引为3行2列的数据
print(data[1:3])    #二维数组切片操作,获取索引为1到2行所有列的数据
print(data[:, 2:4])  #二维数组切片操作,获取索引为2到3列的所有行数据
print(data[1:3][2:4]) #想要获取1到2行和2到3列数据,单数会引发bug

在这里插入图片描述
上面就是二维数组索引和切片的大部分操作,对于索引来说可以使用data[3, 2]也可以使用data[3][2]操作,这两个获取的结果是一致的,那对于切片操作来说为啥data[1:3, 2:4]和操作data[1:3][2:4]不仅获取的结果不一致而且data[1:3][2:4]获取到的数据为空。对于初学者来说可能很难理解这样的情况,不知道bug的原因。但是换个索引行列data[1:3][0:2]会获得下面结果
在这里插入图片描述
这个情况就比较让人费解了,索引1到2行2到3列的数据获取为空,索引1到2行0到1列反而可以得到数据。问题是二维数组的大小为5x5,无论哪种索引都没超过数组范围啊。但是仔细查看索引数据data[1:3][0:2]发现得到的并不是1到2行0到1列的数据,而是1到2行所有列的数据。什么原因导致的呢?因为[1:3][0:2]这样的索引方式并不是向我们想的那样获取1到2行0到1列的数据。而是两次行索引操作,第一次获取1到2行所有列数据,数据大小为2x5,第二次获取0到1行的所有列数据。这样并没有列索引的操作,因此无法获取我们想要的数据。那为啥data[1:3][2:4]索引的数据为空呢?因为第一次行索引得到2x5大小的二维数组,第二次行索引获取2到3行的数据超出了数据大小范围,因此获得的数据为空。所以对于二维数组data[1:3][2:4]不是对相应的行列索引切片,而是进行了两次行切片。切记不要搞错,不然获取数据为空引发的bug还好解决,万一获取错误数据可能就不容易发现Bug了。
那为何进行索引操作data[3, 2]和data[3][2]都可以正常获取数据呢?(PS:要不是有这样一个索引操作,估计大家就不会使用类似的切片操作了)因为第一次行索引获得第3行数据,大小为1x5,第二次获取第3行中的第2个数据因此可以正常获取到3行2列的数据。

二维(错误)列表

在这里插入图片描述
对于二维列表或者元组进行索引或者切片操作,可能会引发以上Bug

    zarten = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]]print(zarten)print(zarten[3][2])print(zarten[1:3][0:2])print(zarten[1:3, 2:4])  #错误切片操作print(zarten[3, 2])      #错误索引操作

在这里插入图片描述
为何二维列表或元组进行二维数组类似的索引和切片操作就会出现以上报错,因为列表和元组没有二维数据,有同学觉得上面5x5的不就是二维列表吗?其实不是,这只是个列表中的列表,并无行列区分。比如列表中每个列表的元素个数可以不同,第一个列表中可以有5个元素,第二个列表中可以有3个元素等等,因此列表、元组并不能像我们认为的二维数组那样进行行列索引、切片操作。但是如果列表中的每个列表元素个数以及数据类型都一致,可以通过将列表转换为NumPy数组进行行列索引、切片操作。

import numpy as np
data = np.array(data)

祝好~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/418228.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三、基础篇 vue Class与Style绑定

操作元素的 class 列表和内联样式是数据绑定的一个常见需求。因为它们都是 attribute,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可。不过,字符串拼接麻烦且易错。因此,在将 v-bind 用于 class 和 style…

基于ORB算法的图像匹配

基础理论 2006年Rosten和Drummond提出一种使用决策树学习方法加速的角点检测算法,即FAST算法,该算法认为若某点像素值与其周围某邻域内一定数量的点的像素值相差较大,则该像素可能是角点。 其计算步骤如下: 1)基于F…

MCU最小系统原理图中四个问题详解——芯片中有很多电源管脚的原因(VDD/VSS/VBAT)、LC滤波、两级滤波、NC可切换元件

前言:本文对MCU最小系统原理图中的四个问题进行详解:芯片中有很多电源管脚的原因(VDD/VSS/VBAT)、LC滤波、两级滤波、NC可切换元件。本文以GD32F103C8T6最小系统原理图举例 目录: 芯片中有很多电源管脚的原因&#x…

自然语言处理(Natural Language Processing,NLP)解密

专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏:http://t.csdnimg.cn/WDmJ9 Python 专栏:http://t.csdnimg.cn/hMwPR Redis 专栏:http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏:http://t.csdni…

zabbix邮件告警

目录 一、获取邮箱的授权码(自行解决) 二、 配置报警媒介(收件人) 三、配置报警媒介类型 四、定义一个动作(前提是主机,监控项,触发器都已配置成功) 一、获取邮箱的授权码&#x…

探索图像检索:从理论到实战的应用

目录 一、引言二、图像检索技术概述图像检索的基本概念图像检索与文本检索的区别特征提取技术相似度计算索引技术 三、图像检索技术代码示例图像特征提取示例相似度计算索引技术 四、图像搜索流程架构数据采集与预处理特征提取相似度计算与排名结果呈现与优化 五、实际应用图像…

如何为不同品牌的笔记本电脑设置充电限制,这里提供详细步骤

笔记本电脑的电池健康状况至关重要。延长电池寿命可以帮你省下不少钱。对于长时间充电的Windows 11笔记本电脑用户来说,将电池电量限制在80%是很重要的。 虽然操作系统没有提供设置自定义电池充电限制的内置方法,但仍有一些方法可以在Windows 11中配置电池设置,并将其限制在…

大数据导论(3)---大数据技术

文章目录 1. 大数据技术概述2. 数据采集与预处理2.1 数据采集2.2 预处理 3. 数据存储和管理3.1 分布式基础架构Hadoop3.2 分布式文件系统HDFS3.3 分布式数据库HBase3.4 非关系型数据库NoSQL 4. 数据可视化与保护 1. 大数据技术概述 大数据技术主要包括数据采集与预处理、数据存…

【网络安全】-入门版

secure 一、基本工具1、metasploit framework ps.本着兴趣爱好,加强电脑的安全防护能力,并严格遵守法律和道德规范。一、基本工具 1、metasploit framework msf(metasploit framework)是一个开源的渗透测试框架,用于…

回调地狱与解决方案

什么是回调地狱? 简单理解就是回调函数嵌套回调 示例: setTimeout(() > {console.log(1);setTimeout(() > {console.log(2);setTimeout(() > {console.log(3);}, 1000);}, 2000)}, 3000)如上代码所示,回调函数嵌套回调,就…

docker安装 mysql 8.0.32

首先下载 mysql 其次如果虚拟机以前安过mysql 需要把mysql关闭 命令 永久关闭mysql 但是当前不生效 需要重启虚拟机 systemctl enable mysqld 如果不想重启虚拟机 可以执行 systemctl stop mysqld //指定版本 docker pull mysql:8.0.32 // 拉取最新的…

keep-alive组件缓存

keep-alive组件缓存 从a跳b,a已经销毁,b重新渲染;b跳a,b销毁a重新渲染 源组件销毁,目标组件渲染 组件缓存:组件实例等相关( 包括vnode)存储起来 重新渲染指的是:把视图重…