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

news2024/9/20 6:28:22

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.coloradmin.cn/o/1399019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实验七 RMAN恢复管理器

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

Linux的权限(3)

目录 文件类型 ​d目录文件 -普通文件 l链接文件 b块设备文件 p管道文件 c字符设备文件 文件权限 目录权限 umask 粘滞位 Q1umask权限默认值664/775 Q2"可执行性"权限 Q3"删除"权限 Q4怎么共享一批文件 【1】粘滞位 【2】添加交互人员到所…

SpringBoot跨域问题解决

前端访问后台接口时,浏览器报错,跨域无法访问。 报错信息如下: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the requested resource. 经过一番百度之后&#…

(2024,VMamba,交叉扫描,线性复杂度,全局感受野,动态权重)视觉状态空间模型

VMamba: Visual State Space Model 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 3. 方法 3.1 基础概念 3.2 2D 选择性扫描 3.3 VMamba 模型 3.3.1 整体架构 3.3.2 VSS…

如何用H5+CSS+JS写一个简单的招聘网站

大家好,我是猿码叔叔,一个 Java 语言开发者。应网友要求,写一个简单的招聘页面。由于技术原因,页面相对简单,朋友们可以选择性的阅读,如果对您有帮助,也可直接拿去使用,因为接下来除…

Linux ---- 小玩具

目录 一、安装: 1、佛祖保佑,永不宕机,永无bug 2、小火车 3、艺术字和其它 天气预报 艺术字 4、会说话的小牦牛 5、其他趣味图片 我爱你 腻害 英雄联盟 帅 忍 龙 你是猪 福 好运连连 欢迎 加油 想你 忘不了你 我错了 你…

介绍几个免费的国内chatgpt网站

概述:水点文章。 第一:chataa网站 chataa (chat778.com) 进去之后注册一下,即可免费使用。 第二:AlchatOS网站 AIchatOS 第三:ChatGPT在线聊天 ChatGPT在线聊天 (zxf7460.cn) 第四:说我真帅&#xff0…

重构改善既有代码的设计-学习(一):封装

1、封装记录(Encapsulate Record) 一些记录性结构(例如hash、map、hashmap、dictionary等),一条记录上持有什么字段往往不够直观。如果其使用范围比较宽,这个问题往往会造成许多困扰。所以,记录…

pytest + allure(windows)安装

背景 软硬件环境: windows11,已安装anaconda,python,pycharm用途:使用pytest allure 生成报告allure 依赖java,点击查看java安装教程 allure 下载与安装 从 allure下载网址下载最新版本.zip文件 放在自…

火速收藏!2024 新年微信红包封面领取全攻略

2024“龙”重登场!今年有哪些令人期待的红包封面? 前方大批精美红包封面来袭,全新品牌氛围红包封面上线,支持品牌定制特色氛围元素,沉浸感受浓浓年味儿,收获满满惊喜! 新年开好运,微…

7 python快速上手

数据类型(下) 数据类型(下)1.集合(set)1.1 定义1.2 独有功能1.3 公共功能1.4 转换1.5 其他1.5.1 集合的存储原理1.5.2 元素必须可哈希1.5.3 查找速度特别快1.5.4 对比和嵌套 强插:None类型2.字典…

CloudPanel file-manager/backend/makefile接口存在远程命令执行漏洞CVE-2023-35885

@[toc] 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. CloudPanel 简介 微信公众号搜索:南风漏…

Vulnhub靶机:EvilBox-One

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:EvilBox-One(10.0.2.25) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vulnhub.com/entry/e…

python中Pytest常用的插件

前言 除了框架本身提供的功能外,Pytest还支持上百种第三方插件,良好的扩展性可以更好的满足大家在用例设计时的不同需求。本文将为大家详细介绍下面5项常用的插件。 1. 用例依赖 编写用例的时候,我们会注意用例之间的独立性,但部…

Python爬虫IP池

目录 一、介绍 1.1 为什么需要IP池? 1.2 IP池与代理池的区别 二、构建一个简单的IP池 三、注意事项 一、介绍 在网络爬虫的世界中,IP池是一个关键的概念。它允许爬虫程序在请求网页时使用多个IP地址,从而降低被封禁的风险,提高…

【2024最新】如何有效搭建自动化测试框架?

前言 最近好多小伙伴都在说接口自动化测试,那么究竟什么是接口自动化测试呢?让我们一起往下看就知道了,首先我们得先弄清楚下面这个问题。 为什么要做(自动化)接口测试? 1、由于现在各个系统的复杂度不断…

Jenkins环境配置篇-更换插件源

作为持续集成的利器 Jenkins 已经得到了广泛地应用,仅仅作为一个工具,Jenkins 已然有了 自己的生态圈,支持其的 plugin 更是超过 1300。在实际中如何使用以及如何更好地使用 jenkins,一直是大家在实践并讨论的。本系列文章将会从如…

正则表达式第三四个作用:替换、切割

目录 方法二 replaceAll: 方法三:spilt: 方法一之前已经见过了: 方法二 replaceAll: 形参中: 参数regex表示一个正则表达式。可以将当前字符串中匹配regex正则表达式的字符串替换为newStr。 代码演示 S…

容器技术1-容器与镜像简介

目录 1、容器与虚拟化 2、容器发展历程 3、镜像简介 4、镜像原理 (1)分层存储 (2)写时复制 (3)内容寻址 (4)联合挂载 1、容器与虚拟化 容器技术在操作系统层面实现了对计算机…

全志D1-H芯片Tengine支持

简介 ​ Tengine 是 OPEN AI LAB 推出的边缘 AI 计算框架,致力于解决 AIoT 产业链碎片化问题,加速 AI 产业化落地。Tengine 为了解决 AIoT 应用落地问题,重点关注嵌入式设备上的边缘 AI 计算推理,为海量 AIoT 应用和设备提供高性…