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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络文件共享ftp

一,存储类型 (一)三种存储类型介绍 直连式存储:Direct-Attached Storage,简称DAS 直连:硬盘加服务器 存储区域网络:Storage Area Network,简称SAN(可以使用空间&#…

vue3 + antd 封装动态表单组件(一)

前置条件: vue版本 v3.3.11 ant-design-vue版本 v4.1.1 创建动态组件配置文件config.js import { Input, Textarea, InputNumber, Select, RadioGroup, CheckboxGroup, DatePicker } from ant-design-vue;// 表单域组件类型 export const componentsMap {Text: …

还在手动复制文章吗?教你如何一键将文章从notion同步到WordPress

本文会给大家介绍如何在WordPress上安装一个插件,实现将notion上写的文章自动同步到WordPress上,从而提高写作效率,接下来请跟随我的脚步一起来操作吧! 一、插件安装 在WordPress后台添加新插件页面中搜索“notion”,…

实验六 模式对象管理与安全管理

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

Matplotlib Mastery: 从基础到高级的数据可视化指南【第30篇—python:数据可视化】

文章目录 Matplotlib: 强大的数据可视化工具1. 基础1.1 安装Matplotlib1.2 创建第一个简单的图表1.3 图表的基本组件:标题、轴标签、图例 2. 常见图表类型2.1 折线图2.2 散点图2.3 条形图2.4 直方图 3. 图表样式与定制3.1 颜色、线型、标记的定制3.2 背景样式与颜色…

Linux——进程等待

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、为什么要进程等待二、进程等待的方法1、wait方法2、waitpid方法 三、获取子进程status 一…

2008年苏州大学837复试机试C语言

2008年苏州大学复试机试C 题目 编写程序充成以下功能: 一、从键盘上输入随机变量x的 10个取样点。X0,X1—X9 的值; 1、计算样本平均值 2、判定x是否为等差数列 3、用以下公式计算z的值(t0.63) 注。请对程序中必要地方进行注释 补充:个人觉得这个题目回…

【51单片机】矩阵按键

0、前言 参考&#xff1a;普中 51 单片机开发攻略 1、硬件 2、软件 main.c #include <reg52.h> #include <intrins.h> #include "delayms.h"typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; #define GPIO_KEY P1 #d…

leetcode:每日温度---单调栈

题目&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例&…

浪花 - 用户信息展示+更新

1. 用户登录获取登录凭证 已登录的用户才能获取个人信息发送 Aixos 请求登录 const user ref();onMounted(async () > {const res await myAxios.get(/user/current);if (res.code 0) {console.log("获取用户信息成功");user.value res.data;} else {consol…

python_selenium自动化测试框架

设计思路 本文整理归纳以往的工作中用到的东西&#xff0c;现汇总成基础测试框架提供分享。 框架采用python3 selenium3 PO yaml ddt unittest等技术编写成基础测试框架&#xff0c;能适应日常测试工作需要。 1、使用Page Object模式将页面定位和业务操作分开&#xff0…

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

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

多维表格产品vika多维表、Flowus、Wolai体验记录

昨天从下午6点肝到凌晨2点多体验低代码平台多维表格产品&#xff0c;体验了3个国内产品&#xff0c;vika多维表、Flowus、Wolai。 具有多维表格新型关系数据库的鼻祖是 Airtable&#xff0c;国内模仿产品有vika多维表、飞书多维表格等。 还有一种类型就是以在国内鼎鼎大名的N…

流式湖仓增强,Hologres + Flink构建企业级实时数仓

云布道师 2023 年 12 月&#xff0c;由阿里云主办的实时计算闭门会在北京举行&#xff0c;阿里云实时数仓Hologres 研发负责人姜伟华现场分享 HologresFlink 构建的企业级实时数仓&#xff0c;实现全链路的数据实时计算、实时写入、实时更新、实时查询。同时&#xff0c;随着流…

实验七 RMAN恢复管理器

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Python笔记10-数据可视化练习折线图

文章目录 JSON数据Python数据和Json数据的相互转化pyecharts模块构建折线图全局配置绘制疫情数据折线图 JSON数据 JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据 。本质上是一个带有特定格式的字符串 主要功能&#xff1a;可以在各个编程语言中流通…

JumpServer 堡垒机安装指南

介绍 什么是JumpServer JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpServer 帮助企业以更安全的方式管控和登录所有类型的资产&#xff0c;包括&#xff1a; SSH (Linux / Unix / 网络设备 等)Windows (Web 方式连接 / 原生 R…

Wpf 使用 Prism 实战开发Day13

配置 AutoMapper 关系映射 在上一节 ToDoController 控制器&#xff0c;或 IToDoService 服务接口中&#xff0c;方法的传参都是直接传的实体类。但在实际开发过程中&#xff0c;这样是不允许的。标准且规范的做法是&#xff0c;定义一个数据传输层&#xff0c;即Dto层。 一.在…

forEach如何跳出或中断循环

文章目录 概要使用try...catch抛出错误设置数组长度为0使用splice删除数组的元素 概要 在Javascript中&#xff0c;我们使用forEach遍历循环的时候&#xff0c;往往会面临跳出循环和中断循环&#xff0c;我们可以采取以下几种方式&#xff1a; 使用try…catch抛出错误 const …

智能音箱喇叭杂音问题

智能音箱喇叭杂音问题 智能音箱生厂或出货过程会遇到多种喇叭播放有杂音的问题&#xff0e; 螺丝不匹配 智能音箱设备在生产过程&#xff0c;会有SPL测试喇叭失真&#xff0c;发现不良率8%的杂音问题&#xff0e; 分析原因是来料导入了新螺丝&#xff0c; 使用过程进入异物…