python打卡day16
NumPy 数组基础
因为前天说了shap,这里涉及到数据形状尺寸问题,所以需要在这一节说清楚,后续的神经网络我们将要和他天天打交道。
知识点:
- numpy数组的创建:简单创建、随机创建、遍历、运算
- numpy数组的索引:一维、二维、三维
- SHAP值的深入理解
作业:今日知识点比较多,好好记忆下
1. 理解数组的维度 (Dimensions)
NumPy 数组的维度或称为轴 (Axis)的概念,与我们日常理解的维度非常相似。直观判断:数组的维度层数通常可以通过打印输出时中括号 `[]` 的嵌套层数来初步确定:
一层 `[]`:一维数组。两层 `[]`:二维数组。三层 `[]`:三维数组,依此类推。
2. NumPy 数组与深度学习 Tensor 的关系
在后续进行频繁的数学运算时,尤其是在深度学习领域,对 NumPy 数组的理解非常有帮助,因为 PyTorch 或 TensorFlow 中的Tensor张量本质上可以视为支持 GPU 加速和自动微分的 NumPy 数组。掌握 NumPy 的基本操作,能极大地降低学习 Tensor 的门槛。关于 NumPy 更深入的性质,我们留待后续探讨。
3. 一维数组 (1D Array)
一维数组在结构上与 Python 中的列表(List)非常相似。它们的主要区别在于:
打印输出格式: 当使用 `print()` 函数输出时:NumPy 一维数组的元素之间默认使用空格分隔。Python 列表的元素之间使用逗号分隔。
# 分清楚列表和数组的区别
print([7, 5, 3, 9]) # 输出: [7, 5, 3, 9](逗号分隔)
print(np.array([7, 5, 3, 9])) # 输出: [7 5 3 9](空格分隔)
4. 二维数组 (2D Array)
二维数组可以被看作是“数组的数组”或者一个矩阵。其结构由两个主要维度决定:
- 行数:代表整个二维数组中包含多少个一维数组。
- 列数:代表每个一维数组(也就是每一行)中包含多少个元素。
值得注意的是,二维数组不一定是正方形(即行数等于列数),它可以是任意的 `n * m` 形状,其中 `n` 是行数,`m` 是列数。
5. 数组的创建
NumPy 的 `array()` 函数非常灵活,可以接受各种“序列型”对象作为输入参数来创建数组。这意味着你可以将 Python 的列表 (List)、元组 (Tuple),甚至其他的 NumPy 数组等数据结构直接传递给 `np.array()` 来创建新的 NumPy 数组。
一、简单赋值创建
import numpy as np
a = np.array([2,4,6,8,10,12]) # 创建一个一维数组
b = np.array([[2,4,6],[8,10,12]]) # 创建一个二维数组
print(a)
print(b)# ------ 以下是结果 -------
[ 2 4 6 8 10 12]
[[ 2 4 6][ 8 10 12]]
最重要的是数组的形状要搞清楚
a.shape # 结果是(6,),1个数字表示1维
b.shape # 结果是(2, 3),2个数字表示2维
区分一下一维数组(6,)和二维数组(1,6)、(6,1)
# 一维数组 (6,)
a = np.array([1,2,3,4,5,6])
# 二维数组 (1,6)
b = np.array([[1,2,3,4,5,6]])
# 二维数组 (6,1)
c = np.array([[1],[2],[3],[4],[5],[6]])
二、全零数组、全一数组、顺序数组
zeros = np.zeros((2, 3)) # 创建一个2行3列的全零矩阵
zeros
# -------- 以下是输出结果 --------
array([[0., 0., 0.],[0., 0., 0.]])ones = np.ones((3,)) # 创建一个形状为(3,)的全1数组
ones
# -------- 以下是输出结果 --------
array([1., 1., 1.])arange = np.arange(1, 10) # 创建一个从1到10的数组
arange
# -------- 以下是输出结果 --------
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
1. 是浮点数(float)的简写形式等价于 1.0,表示这是一个浮点数而非整数,NumPy的 ones()/zeros() 等函数默认会创建浮点型数组,这是科学计算的常见需求;arange()默认创建整数型数组,设计用于生成序列,常用于索引等整数场景,np.arange() 只能直接创建一维数组,但通过reshape等后续操作可自由转换维度,常用于创建二维数组和三维数组
arr3d = np.arange(3 * 4 * 5).reshape((3, 4, 5))
# 生成从0-59的连续一维数组,再重塑为3×4×5的三维数组(层数, 行数, 列数)# ---------- 以下为结果 -----------
array([# 第0层 (shape: 4x5)[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14],[15, 16, 17, 18, 19]],# 第1层 [[20, 21, 22, 23, 24],[25, 26, 27, 28, 29],[30, 31, 32, 33, 34],[35, 36, 37, 38, 39]],# 第2层[[40, 41, 42, 43, 44],[45, 46, 47, 48, 49],[50, 51, 52, 53, 54],[55, 56, 57, 58, 59]]
])
三、随机创建数组
1. 在后续深度学习中,我们经常需要对数据进行随机化处理,以确保模型的泛化能力。
2. 为了测试很多函数的性能,往往需要随机化生成很多数据。
- 记忆技巧:
1. 看结尾:
- "int" → 整数
- "n" → 正态(normal)
2. 看前缀:
- 纯"random" → Python基础随机
- "np.random" → NumPy增强版
3. 功能差异:
- `rand()`和`random()`都是均匀分布,但`rand()`能直接生成数组
- `randn()`生成的数据会有正有负,其他方法都是非负数
来应用一下:
import numpy as np
np.random.seed(42) # 设置随机种子以确保结果可重复# 生成10个语文成绩(正态分布,均值75,标准差10)
chinese_scores = np.random.normal(75, 10, 10).round(1)
# 第一个参数75为均值。第二个参数10为标准差,第三个参数10为数组大小
# .normal() 生成原始随机数(可能含多位小数) .round(1) 将结果四舍五入保留1位小数# 找出最高分和最低分及其索引
max_score = np.max(chinese_scores)
max_index = np.argmax(chinese_scores)
min_score = np.min(chinese_scores)
min_index = np.argmin(chinese_scores)print(f"所有成绩: {chinese_scores}")
print(f"最高分: {max_score} (第{max_index}个学生)")
print(f"最低分: {min_score} (第{min_index}个学生)")# ---------- 以下为结果 ----------
所有成绩: [80. 73.6 81.5 90.2 72.7 72.7 90.8 82.7 70.3 80.4]
最高分: 90.8 (第6个学生)
最低分: 70.3 (第8个学生)
四、数组的运算
很简单,全部参考线代的矩阵计算规则即可,但注意直接用' * '、' / '符号进行的是逐元素乘除法,矩阵乘法是' @ '运算符,矩阵除法要先求逆再矩阵乘法,就是注意一下 NumPy 的 * 相当于MATLAB的 .*,而 @ 相当于MATLAB的 *
五、数组的索引
1.一维数组
对于一维数组取一个元素的索引来说,跟列表差不多
整数数组进行索引一次性取多个元素:语法是 arr1d[[index1, index2, ...]]
arr1d[[3, 5, 8]] # 取出数组中索引为 3, 5, 8 的元素
切片进行索引一次性取多个元素:语法是 arr1d[start : stop],假如步长想要自己设置
arr1d[start : stop : step]
arr1d[2:6] # 取出索引为2到5的元素(不包括索引6的元素,取左不取右)arr1d[:5] # 取出数组中从头到索引 5 (不包含 5) 的元素arr1d[4:] # 取出数组中从索引 4 到结尾的元素arr1d[:] # 取出全部元素arr1d[::2] # 取出数组中所有偶数索引对应的元素 (即索引 0, 2, 4, 6, ...)
2.二维数组
索引顺序:在二维数组 arr2d 里,第一个索引值代表行,第二个索引值代表列。比如 arr2d[i , j] ,i 是行索引,j 是列索引
arr2d[1, :] # 取出第 2 行 (索引为 1) 的所有元素,也可以省略后面的:成arr2d[1]arr2d[:, 2] # 取出第 3 列 (索引为 2) 的所有元素arr2d[[0, 2], :] # 使用整数数组作为行索引,取出由第 1 行和第 3 行的元素arr2d[:, [1, 3]] # 使用整数数组作为列索引,取出由第 2 列和第 4 列的元素arr2d[1:3, 1:3] # 使用切片作为索引,取出一个 2x2 的子矩阵
3.三维数组
和二维数组的索引差不多
arr3d = np.arange(3 * 4 * 5).reshape((3, 4, 5))
# 生成从0-59的连续一维数组,再重塑为3×4×5的三维数组(层数, 行数, 列数)# ---------- 以下为结果 -----------
array([# 第0层 (shape: 4x5)[[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14],[15, 16, 17, 18, 19]],# 第1层 [[20, 21, 22, 23, 24],[25, 26, 27, 28, 29],[30, 31, 32, 33, 34],[35, 36, 37, 38, 39]],# 第2层[[40, 41, 42, 43, 44],[45, 46, 47, 48, 49],[50, 51, 52, 53, 54],[55, 56, 57, 58, 59]]
])arr3d[1, :, :] # 选择第二层
# --------- 以下为结果 -----------
array([[20, 21, 22, 23, 24],[25, 26, 27, 28, 29],[30, 31, 32, 33, 34],[35, 36, 37, 38, 39]])arr3d[1, 0:2, :]# 使用整数数组 [0, 2] 作为第一个维度 (层) 的索引
# --------- 以下为结果 -----------
array([[20, 21, 22, 23, 24],[25, 26, 27, 28, 29]])arr3d[1, 0:2, 2:4]
# --------- 以下为结果 -----------
array([[22, 23],[27, 28]])
收获心得:
学完了再调转回去看看shap库那一节的shap_values的索引,应该就能搞懂了
@浙大疏锦行
相关文章:

python打卡day16
NumPy 数组基础 因为前天说了shap,这里涉及到数据形状尺寸问题,所以需要在这一节说清楚,后续的神经网络我们将要和他天天打交道。 知识点: numpy数组的创建:简单创建、随机创建、遍历、运算numpy数组的索引:…...

Redis 学习笔记 5:分布式锁
Redis 学习笔记 5:分布式锁 在前文中学习了如何基于 Redis 创建一个简单的分布式锁。虽然在大多数情况下这个锁已经可以满足需要,但其依然存在以下缺陷: 事实上一般而言,我们可以直接使用 Redisson 提供的分布式锁而非自己创建。…...

游戏开发实战(一):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
文章目录 奇美拉项目游戏规则奇美拉(Chimeras)档案领队成员 结果展示: 奇美拉项目 由于项目工程较大,并且我打算把我的思考过程和实现过程中踩过的坑都分享一下,因此会分3-4篇博文详细讲解本项目。本文首先介绍下游戏规则并给出奇美拉档案。…...
VS2017编译librdkafka 2.1.0
VS2017编译librdkafka 2.1.0 本篇是 Windows系统编译Qt使用的kafka(librdkafka)系列中的其中一篇,编译librdkafka整体步骤大家可以参考: Windows系统编译Qt使用的kafka(librdkafka) 由于项目需要,使用kafka,故自己编译了一次,编译的过程,踩了太多的坑了,特写了本篇…...

02- 浏览器运行原理
文章目录 1. 网页的解析过程浏览器内核 2. 浏览器渲染流程2.1 解析html2.2 生成css规则2.3 构建render tree2.4 布局(Layout)2.5 绘制(Paint) 3. 回流和重绘3.1 回流reflow(1)理解:(2)出现情况 3.2 重绘repaint&#x…...
Reactor模型详解与C++实现
Reactor模型详解与C实现 一、Reactor模型核心思想 Reactor模式是一种事件驱动的并发处理模型,核心通过同步I/O多路复用实现对多个I/O源的监听,当有事件触发时,派发给对应处理器进行非阻塞处理。 关键特征: 非阻塞I/Oÿ…...
人工智能重塑医疗健康:从辅助诊断到个性化治疗的全方位变革
人工智能正在以前所未有的速度改变着医疗健康领域,从影像诊断到药物研发,从医院管理到远程医疗,AI 技术已渗透到医疗服务的各个环节。本文将深入探讨人工智能如何赋能医疗健康产业,分析其在医学影像、临床决策、药物研发、个性化医…...

移除链表元素数据结构oj题(力扣题206)
目录 题目描述: 题目解读(分析) 解决代码 题目描述: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 题目解读(分析&#…...
学习记录:DAY29
项目开发日志:技术实践与成长之路 前言 回顾这几天的状态,热情总是比我想象中更快被消耗完。比起茫然徘徊的小丑,我更希望自己是对着风车冲锋的疯子。 今天继续深入项目的实际业务。 状态好点的时候,再看自己EMO时写的东西&…...

OpenTelemetry 从入门到精通
快速入门 OpenTelemetry 是一个可观测性框架和工具包, 旨在创建和管理遥测数据,如链路、 指标和日志。 重要的是,OpenTelemetry 是供应商和工具无关的,这意味着它可以与各种可观测性后端一起使用, 包括 Jaeger 和 Pro…...
数学复习笔记 17
前言 复盘泰勒公式,极限四则运算,洛必达,拉格朗日。 1.27 因为是复习泰勒公式,所以就算有别的方法,我也硬是要用泰勒公式。就是为了记一下泰勒公式。泰勒公式确实是能做,但是做的我非常非常难受。公式确…...
C语言:在操作系统中,链表有什么应用?
在操作系统中,链表是一种重要的数据结构,凭借其灵活的内存管理和高效的插入/删除特性,被广泛应用于多个核心模块。以下是其主要应用场景及详细说明: 1. 内存管理:空闲内存块管理 应用场景:操作系统需要管…...
解锁MySQL性能调优:高级SQL技巧实战指南
高级SQL技巧:解锁MySQL性能调优的终极指南 开篇 当前,随着业务系统的复杂化和数据量的爆炸式增长,数据库性能调优成为了技术人员面临的核心挑战之一。尤其是在高并发、大数据量的场景下,SQL 查询的性能直接影响到整个系统的响应…...
裸金属服务器和云服务器之间的差别
裸金属服务器能够直接在硬件上运行,不需要额外的虚化层,让每个应用程序或者是服务都能够在实际的硬件上运行,不需要和其他虚拟服务器来共享资源;而云服务器作为一种虚拟服务器,是通过虚拟化技术为企业提供一个独立的计…...
WebSocket实时双向通信:从基础到实战
一、WebSocket 基础概念 1. 什么是 WebSocket? 双向通信协议:与 HTTP 的单向请求不同,WebSocket 支持服务端和客户端实时双向通信。 低延迟:适用于聊天室、实时数据推送、在线游戏等场景。 协议标识:ws://ÿ…...

【免杀】C2免杀技术(六)进程镂空(傀儡进程)
一、技术定位与核心思想 进程镂空(Process Hollowing)属于 MITRE ATT&CK 中 T1055.012 子技术:先创建一个合法进程并挂起,随后把其主模块从内存“掏空”并替换为恶意映像,最后恢复线程执行,从而让…...
ETL数据集成产品选型需要关注哪些方面?
ETL(Extract,Transform,Load)工具作为数据仓库和数据分析流程中的关键环节,其选型对于企业的数据战略实施有着深远的影响。谷云科技在 ETL 领域耕耘多年,通过自身产品的实践应用,对 ETL 产品选型…...

Eclipse Java 开发调优:如何让 Eclipse 运行更快?
Eclipse Java 开发调优:如何让 Eclipse 运行更快? 在 Java 开发领域,Eclipse 是一款被广泛使用的集成开发环境(IDE)。然而,随着项目的日益庞大和复杂,Eclipse 的运行速度可能会逐渐变慢&#x…...

彻底理解事件循环(Event Loop):从单线程到异步世界的桥梁
关于事件循环被问了很多次,也遇到过很多次,一直没有系统整理,网上搜的,基本明白但总感觉不够透彻,最后,自己动手,丰衣足食,哈哈 一、为什么需要事件循环?—— 单线程的困…...
java加强 -stream流
Stream流是jdk8开始新增的一套api,可以用于操作集合或数组的内容。 Stream流大量的结合了Lambda的语法风格来编程,功能强大,性能高效,代码简洁,可读性好。 体验Stream流 把集合中所有以三开头并且三个字的元素存储到…...
Vue百日学习计划Day33-35天详细计划-Gemini版
总目标: 在 Day 33-35 理解 Vue 组件从创建到销毁的完整生命周期,熟练掌握 Composition API 中主要的生命周期钩子,并知道在不同阶段执行哪些操作。 所需资源: Vue 3 官方文档 (生命周期钩子): https://cn.vuejs.org/guide/essentials/lifecycle.html你…...

Linux(2)——shell原理及Linux中的权限
目录 一、shell的运行原理 二、Linux中权限的问题 1.权限的概念 2.如何进行用户的切换 1)从普通用户切到超级用户 2)从root用户切到普通用户 3.如何实现提权操作 4.如何将普通用户添加到信用列表(sudoers) 编辑5.Lin…...

如何在线免费压缩PDF文档?
PDF文件太大,通常是因为内部嵌入字体和图片。怎么才能将文件大小减减肥呢,主要有降低图片清晰度和去除相关字体两个方向来实现文档效果。接下来介绍三个免费压缩PDF实用工具。 (一)iLoveOFD在线转换工具 iLoveOFD在线转换工具&a…...
EasyExcel动态表头
专家官方解答 : 在使用EasyExcel处理Excel动态表头的问题时,官方并不推荐使用includecolumnfieldnames方法。根据提供的知识内容,以下是如何实现动态表头的详细步骤和解释: 原因分析 动态表头的需求通常来源于希望根据用户的选…...

汽车装配又又又升级,ethernetip转profinet进阶跃迁指南
1. 场景描述:汽车装配线中,使用EtherNet/IP协议的机器人与使用PROFINET协议的PLC进行数据交互。 2. 连接设备:EtherNet/IP机器人控制器(如ABB、FANUC)与PROFINET PLC(如西门子S7-1500)。 3. 连…...

css:无限滚动波浪线
以上是需要实现的效果,一条无限滚动波浪线,可以用来做区块的分割线。 要形成上下交替的圆形,思路是给div加圆角边框,第一个只有上边框,第二个只有下边框。 循环了100个div,这个数量根据自己容器宽度调整&…...
显示器无法接受键盘/鼠标问题解决
我们将键盘、鼠标的u盘插到显示器上后,仍然无法通过键盘和鼠标操控显示器是因为我们的显示器和笔记本/主机之间的连接只有一个typec对typec,无法满足信号传输 我们需要一根上行线:一头 typec/usb 接到主机/笔记本,然后另一头是 m…...

w~自动驾驶~合集3
我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法来啦! 在自动驾驶系统当中,感知任务是整个自驾系统中至关重要的组成部分。感知任务的主要目标是使自动驾驶车辆能够理解和感知周围的环境元素&…...
<C++> MFC自动关闭对话框(MessageBoxTimeout)
MFC自动关闭对话框(MessageBoxTimeout) 记录一下今天在界面开发中的解决方案。自动关闭对话框有两种方案: 1.使用定时器实现延迟关闭(DeepSeek方案) 提示框显示几秒后自动关闭,可以使用 SetTimer KillT…...

山东大学计算机图形学期末复习整理5——CG10上
CG10上 Frenet-Serret框架 空间中一条曲线可以写成参数形式: C ( u ) ( x ( u ) , y ( u ) , z ( u ) ) \mathbf{C}(u) (x(u), y(u), z(u)) C(u)(x(u),y(u),z(u)) 这表示:当参数 u u u 变化时,曲线在三维空间中移动,生成一条轨…...