《Python星球日记》第22天:NumPy 基础
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
目录
- 一、NumPy 简介
- 1. 什么是 NumPy?为什么使用 NumPy?
- 2. 安装与导入
- 二、多维数组操作
- 1. 创建数组
- 2. 数组属性
- 3. 数组索引与切片
- 三、广播机制
- 1. 广播的概念与应用
- 2. 向量化计算的优势
- 四、练习:实现矩阵加法和乘法
- 1. 矩阵加法
- 2. 矩阵乘法
- 五、总结与进阶方向
- 参考资源
专栏介绍: Python星球日记专栏介绍(持续更新ing)
更多Python知识,请关注我、订阅专栏《 Python星球日记》,内容持续更新中…
✅上一篇:Python星球日记 - 第21天:基础阶段大总结
🌟引言: 欢迎来到Python星球🪐的第22天!
今天我们正式进入数据分析与可视化进阶篇,从NumPy基础开始我们的新旅程。NumPy是Python数据分析的基石,掌握它将为你打开数据科学的大门。
一、NumPy 简介
1. 什么是 NumPy?为什么使用 NumPy?
NumPy(Numerical Python)是Python中用于科学计算的基础库,它提供了高性能的多维数组对象和处理这些数组的工具。NumPy是数据分析、机器学习等领域的基础,几乎所有数据科学相关的Python库都以NumPy为基础。
使用NumPy的主要优势:
优势 | 描述 |
---|---|
1️⃣高效的内存管理 | NumPy数组在内存中是连续存储的,比Python原生列表更加高效 |
2️⃣执行速度快 | NumPy底层使用C语言实现,处理大规模数据时比Python原生列表快10-100 倍 |
3️⃣丰富的数学函数 | 内置了大量的数学函数和线性代数操作 |
4️⃣广播功能 | 能够高效地进行不同形状数组之间的运算 |
5️⃣与其他库的兼容性 | 几乎所有数据科学相关的Python库都支持NumPy数组 |
2. 安装与导入
在开始使用NumPy
之前,我们需要先安装它。可以使用pip
进行安装:
pip install numpy
安装完成后,在Python脚本中导入NumPy:
import numpy as np # 通常使用np作为NumPy的简写别名
💡 小贴士:使用别名
np
是数据科学社区的通用约定,这样可以减少代码量并提高可读性。
二、多维数组操作
NumPy的核心是ndarray(N-dimensional array,多维数组)对象,它是一个快速、灵活的大数据集容器。
1. 创建数组
有多种方法可以创建NumPy数组:
1️⃣从Python列表创建一维数组
使用np.array()
函数从Python列表创建一个一维NumPy数组,这是NumPy中最基本的数组创建方法。
import numpy as np
# 从Python列表创建数组
arr1 = np.array([1, 2, 3, 4, 5])
print("一维数组:", arr1)
2️⃣创建二维数组
创建二维数组(矩阵),通过传入嵌套列表来定义行和列。二维数组是科学计算中常用的数据结构。
import numpy as np
# 创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:\n", arr2)
3️⃣创建全0数组
这个代码块说明了如何使用np.zeros()
函数创建所有元素都为0的数组。这在初始化数组或作为占位符时非常有用。
import numpy as np
# 创建全0数组
zeros = np.zeros((3, 4)) # 3行4列的全0数组
print("全0数组:\n", zeros)
4️⃣创建全1数组
这个代码块展示了np.ones()
函数的使用,它创建一个所有元素都为1的数组。这在需要默认值为1的计算中很有用。
import numpy as np
# 创建全1数组
ones = np.ones((2, 3)) # 2行3列的全1数组
print("全1数组:\n", ones)
5️⃣创建等差数列
这个代码块演示了如何使用np.arange()
创建等差数列。该函数类似于Python的range()
,但返回的是NumPy数组而不是列表。
import numpy as np
# 创建等差数列
arange = np.arange(0, 10, 2) # 从0开始,步长为2,小于10
print("等差数列:", arange)
6️⃣创建等间隔数值点
这个代码块展示了np.linspace()
函数,它创建指定范围内均匀分布的点。这在绘图和数值积分等应用中特别有用。
import numpy as np
# 创建等间隔的数值点
linspace = np.linspace(0, 1, 5) # 从0到1之间均匀分布的5个点
print("等间隔数值点:", linspace)
7️⃣创建随机数组
使用NumPy的随机模块创建随机值数组。随机数在模拟、统计和机器学习中广泛应用。
import numpy as np
# 创建随机数组
random_array = np.random.random((2, 2)) # 2×2的随机数组(值在0到1之间)
print("随机数组:\n", random_array)
8️⃣创建单位矩阵
这个代码块展示了如何使用np.eye()
函数创建单位矩阵。单位矩阵在线性代数运算中具有特殊地位,主对角线为1,其余为0。
import numpy as np
# 创建单位矩阵
identity = np.eye(3) # 3×3的单位矩阵
print("单位矩阵:\n", identity)
2. 数组属性
NumPy数组有一些重要的属性,可以帮助我们了解数组的特性:
创建一个 3x4 的 二维数组:
import numpy as np# 创建一个3x4的二维数组
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])# shape:返回数组的形状(每个维度的大小)
print("数组形状:", arr.shape) # 输出:(3, 4)# ndim:返回数组的维度数量
print("维度数量:", arr.ndim) # 输出:2# size:返回数组元素的总数
print("元素总数:", arr.size) # 输出:12# dtype:返回数组元素的数据类型
print("数据类型:", arr.dtype) # 输出:int64(可能因系统而异)# itemsize:返回数组中每个元素的字节大小
print("元素字节大小:", arr.itemsize) # 输出:8(对于64位整数)# 创建指定数据类型的数组
float_arr = np.array([1, 2, 3, 4], dtype=np.float32)
print("浮点数组:", float_arr)
print("浮点数组数据类型:", float_arr.dtype) # 输出:float32
输出结果:
数组形状: (3, 4)
维度数量: 2
元素总数: 12
数据类型: int32
元素字节大小: 4
浮点数组: [1. 2. 3. 4.]
浮点数组数据类型: float32
注意:了解数组的数据类型对于内存优化和性能非常重要,尤其是处理大型数据集时。
3. 数组索引与切片
NumPy数组支持与Python列表类似的索引和切片操作,但功能更加强大:
import numpy as np# 创建一个3x4的二维数组
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])# 访问单个元素:arr[行, 列]
print("第2行第3列的元素:", arr[1, 2]) # 输出:7# 访问整行
print("第1行:", arr[0]) # 输出:[1 2 3 4]# 访问整列(需要使用:表示"所有行")
print("第2列:", arr[:, 1]) # 输出:[ 2 6 10]# 切片:arr[行起始:行结束, 列起始:列结束]
print("子数组(前2行,中间2列):\n", arr[0:2, 1:3])
# 输出:
# [[2 3]
# [6 7]]# 使用负索引(从末尾开始计数)
print("最后一行:", arr[-1]) # 输出:[ 9 10 11 12]
print("倒数第二列:", arr[:, -2]) # 输出:[ 3 7 11]# 条件索引(布尔索引)
print("大于6的元素:", arr[arr > 6])
# 输出:[ 7 8 9 10 11 12]# 花式索引(使用索引数组)
print("第1行和第3行:\n", arr[[0, 2]])
# 输出:
# [[ 1 2 3 4]
# [ 9 10 11 12]]
输出结果:
第2行第3列的元素: 7
第1行: [1 2 3 4]
第2列: [ 2 6 10]
子数组(前2行,中间2列):[[2 3][6 7]]
最后一行: [ 9 10 11 12]
倒数第二列: [ 3 7 11]
大于6的元素: [ 7 8 9 10 11 12]
第1行和第3行:[[ 1 2 3 4][ 9 10 11 12]]
三、广播机制
1. 广播的概念与应用
广播(Broadcasting)是NumPy的一个强大特性,它允许不同形状的数组在算术运算时自动扩展,使数组间的运算更加灵活高效。
遵循以下规则:
- 如果两个数组的维度数不同,形状较小的数组会在左侧补1
- 如果两个数组在某个维度上的大小不匹配,但其中一个的大小为1,则该维度会被"广播"以匹配另一个数组
让我们看一些广播的例子:
1️⃣不同形状数组之间的运算
import numpy as np# 创建数组
a = np.array([1, 2, 3]) # 一维数组:(3,)
b = 5 # 标量# 数组与标量运算 - 广播机制自动将标量扩展为数组
print("数组+标量:", a + b) # 输出:[6 7 8]
print("数组*标量:", a * b) # 输出:[5 10 15]# 不同形状数组之间的运算
a = np.array([[1, 2, 3],[4, 5, 6]]) # 形状为(2, 3)b = np.array([10, 20, 30]) # 形状为(3,)# b会被广播成形状(2, 3)的数组,然后进行元素级加法
print("不同形状数组相加:\n", a + b)
# 输出:
# [[11 22 33]
# [14 25 36]]
2️⃣更复杂的广播示例
import numpy as np# 创建数组
a = np.array([1, 2, 3]) # 一维数组:(3,)
b = 5 # 标量# 数组与标量运算 - 广播机制自动将标量扩展为数组
print("数组+标量:", a + b) # 输出:[6 7 8]
print("数组*标量:", a * b) # 输出:[5 10 15]# 更复杂的广播示例
a = np.array([[1, 2, 3],[4, 5, 6]]) # 形状为(2, 3)
b = np.array([[10], [20]]) # 形状为(2, 1)# b会被广播成形状(2, 3)的数组,每行重复列的值
print("列向量广播:\n", a + b)
# 输出:
# [[11 12 13]
# [24 25 26]]
2. 向量化计算的优势
向量化是指使用向量(数组)操作替代循环的编程风格,它是NumPy高性能的关键。
向量化的主要优势:
- 代码简洁:向量化操作大大减少了代码量
- 执行速度快:NumPy的向量化操作底层是用C实现的,远比Python循环快
- 内存效率高:向量化操作通常更加内存高效
下面是循环和向量化的性能对比:
import numpy as np
import time# 创建两个大数组
size = 10000000
a = np.random.random(size)
b = np.random.random(size)# 使用Python循环计算
start_time = time.time()
result_loop = np.zeros(size)
for i in range(size):result_loop[i] = a[i] + b[i]
loop_time = time.time() - start_time
print(f"循环耗时: {loop_time:.6f}秒")# 使用NumPy向量化计算
start_time = time.time()
result_vectorized = a + b
vectorized_time = time.time() - start_time
print(f"向量化耗时: {vectorized_time:.6f}秒")# 计算加速比
print(f"向量化操作比循环快 {loop_time/vectorized_time:.1f} 倍")# 验证两种方法的结果是否相同
print("结果是否相同:", np.allclose(result_loop, result_vectorized))
输出结果:
循环耗时: 1.961162秒
向量化耗时: 0.028977秒
向量化操作比循环快 67.7 倍
结果是否相同: True
最佳实践:尽可能使用
NumPy
的向量化操作,避免使用Python循环处理NumPy数组。
四、练习:实现矩阵加法和乘法
下面我们将使用NumPy实现矩阵的加法和乘法操作。
1. 矩阵加法
矩阵加法是元素级操作,要求两个矩阵形状相同。
import numpy as np# 创建两个2x3矩阵
A = np.array([[1, 2, 3],[4, 5, 6]])B = np.array([[7, 8, 9],[10, 11, 12]])# 矩阵加法
C = A + B
print("矩阵加法结果:\n", C)# 另一种实现方式
D = np.add(A, B)
print("使用np.add()的结果:\n", D)# 验证两种方法结果相同
print("两种方法结果是否相同:", np.array_equal(C, D))
输出结果:
矩阵加法结果:[[ 8 10 12][14 16 18]]
使用np.add()的结果:[[ 8 10 12][14 16 18]]
两种方法结果是否相同: True
2. 矩阵乘法
NumPy提供了多种实现矩阵乘法的方式:
import numpy as np# 创建矩阵
A = np.array([[1, 2],[3, 4],[5, 6]]) # 3x2矩阵B = np.array([[7, 8, 9],[10, 11, 12]]) # 2x3矩阵# 矩阵乘法(点积)
C = np.dot(A, B)
print("矩阵乘法结果 (np.dot):\n", C)# 使用@运算符(Python 3.5+)
D = A @ B
print("矩阵乘法结果 (@运算符):\n", D)# 使用matmul函数
E = np.matmul(A, B)
print("矩阵乘法结果 (np.matmul):\n", E)# 元素级乘法(不是矩阵乘法!)
# 需要形状相同的矩阵
F = np.array([[1, 2], [3, 4]])
G = np.array([[5, 6], [7, 8]])
H = F * G # 或 np.multiply(F, G)
print("元素级乘法结果:\n", H)
输出结果:
矩阵加法结果:[[ 8 10 12][14 16 18]]
使用np.add()的结果:[[ 8 10 12][14 16 18]]
两种方法结果是否相同: True
注意:不要混淆矩阵乘法(
np.dot
、@
、np.matmul
)和元素级乘法(*
、np.multiply
)!它们的计算方式和结果完全不同。
五、总结与进阶方向
今天我们学习了NumPy
的基础知识,包括数组创建、属性、索引、切片、广播机制和向量化计算。NumPy是Python数据分析的基石,掌握好这些基础对后续学习Pandas、Matplotlib等高级库至关重要。
下一步学习方向:
- NumPy的高级函数(统计函数、线性代数函数等)
- 结构化数组和记录数组
- 文件I/O操作
- 与Pandas的结合使用
练习建议:
1. 尝试使用NumPy解决一些实际问题,如图像处理、数据分析等
2. 探索NumPy的其他创建数组的方法和函数
3. 实践不同形状数组之间的广播操作
4. 比较循环和向量化操作的性能差异
编程提示:多使用
np.info()
和help()
函数查看NumPy函数的详细说明,例如np.info(np.dot)
会显示dot函数的详细文档。
参考资源
- NumPy官方文档:https://numpy.org/doc/stable/
- NumPy用户指南:https://numpy.org/doc/stable/user/
- NumPy备忘单:https://numpy.org/doc/stable/user/numpy-for-matlab-users.html
希望今天的学习让你对NumPy有了初步的了解。在接下来的日子里,我们将继续深入数据分析与可视化的世界! 有什么关于NumPy的问题,欢迎在评论区留言交流!
下一篇预告:在第23天的星球之旅中,我们将探索 Pandas 基础
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
如果你对今天的内容有任何问题,或者想分享你的学习心得,欢迎在评论区留言讨论!
相关文章:
《Python星球日记》第22天:NumPy 基础
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、NumPy 简介1. 什么是 NumPy?为什么使用 NumPy?2. 安…...
Spring Boot 中 Bean 的生命周期详解
Spring Boot 中 Bean 的生命周期详解 一、引言 在 Spring Boot 应用中,Bean 是构成应用程序的基础组件。理解 Bean 的生命周期对于开发高效、稳定的 Spring Boot 应用至关重要。本文将深入探讨 Spring Boot 中 Bean 的完整生命周期过程。 二、Bean 生命周期的基本…...
结构化需求分析:功能、数据与行为的全景建模
目录 前言1 功能模型:数据流图(DFD)的结构与应用1.1 数据流图的基本构成要素1.2 数据流图的层次化设计1.3 数据流图的建模价值 2 数据模型:ER图揭示数据结构与关系2.1 ER图的基本组成2.2 建模过程与注意事项2.3 数据模型的价值体现…...
OpenCompass模型评估
OpenCompass面向大模型的开源方和使用者, 提供开源、高效、全面的大模型评测开放平台。 一、OpenCompass文档 1.基础安装 使用Conda准备 OpenCompass 运行环境: conda create --name opencompass python3.10 -y conda activate opencompass2. 安装 Op…...
基于51单片机语音实时采集系统
基于51单片机语音实时采集 (程序+原理图+PCB+设计报告) 功能介绍 具体功能: 系统由STC89C52单片机ISD4004录音芯片LM386功放模块小喇叭LCD1602按键指示灯电源构成 1.可通过按键随时选择相应的录音进行播…...
NeuroImage:膝关节炎如何影响大脑?静态与动态功能网络变化全解析
膝骨关节炎(KOA)是导致老年人活动受限和残疾的主要原因之一。这种疾病不仅引起关节疼痛,还会显著影响患者的生活质量。然而,目前对于KOA患者大脑功能网络的异常变化及其与临床症状之间的关系尚不清楚。 2024年4月10日,…...
高级java每日一道面试题-2025年4月01日-微服务篇[Nacos篇]-Nacos集群的数据一致性是如何保证的?
如果有遗漏,评论区告诉我进行补充 面试官: Nacos集群的数据一致性是如何保证的? 我回答: Nacos 集群数据一致性保障机制详解 在 Java 高级面试中,Nacos 集群的数据一致性保障是考察分布式系统核心能力的关键点。以下是 Nacos 通过多种机制和技术确保…...
阿里云 OSS 在 ZKmall开源商城的应用实践
ZKmall开源商城通过深度整合阿里云OSS(对象存储服务),构建了高效、安全的文件存储与管理体系,支撑商品图片、用户上传内容等非结构化数据的存储与分发。结合阿里云OSS的技术特性与ZKmall的微服务架构,其实践方案可总结…...
【Linux】线程池与封装线程
目录 一、线程池: 1、池化技术: 2、线程池优点: 3、线程池应用场景: 4、线程池实现: 二、封装线程: 三、单例模式: 四、其他锁: 五、读者写者问题 一、线程池: …...
protobuf的应用
1.版本和引用 syntax "proto3"; // proto2 package tutorial; // package类似C命名空间 // 可以引用本地的,也可以引用include里面的 import "google/protobuf/timestamp.proto"; // 已经写好的proto文件是可以引用 我们版本选择pr…...
linux shell编程之条件语句(二)
目录 一. 条件测试操作 1. 文件测试 2. 整数值比较 3. 字符串比较 4. 逻辑测试 二. if 条件语句 1. if 语句的结构 (1) 单分支 if 语句 (2) 双分支 if 语句 (3) 多分支 if 语句 2. if 语句应用示例 (1) 单分支 if 语句应用 (2) 双分支 if 语句应用 (3) 多分支 …...
图论整理复习
回溯: 模板: void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯ÿ…...
企业指标设计方法指南
该文档聚焦企业指标设计方法,适用于企业中负责战略规划、业务运营、数据分析、指标管理等相关工作的人员,如企业高管、部门经理、数据分析师等。 主要内容围绕指标设计展开:首先指出指标设计面临的困境,包括权责不清、口径不统一、缺乏标准规范、报表体系混乱、指标…...
AIP-217 不可达资源
编号217原文链接AIP-217: Unreachable resources状态批准创建日期2019-08-26更新日期2019-08-26 有时,用户可能会请求一系列资源,而其中某些资源暂时不可用。最典型的场景是跨集合读。例如用户可能请求返回多个上级位置的资源,但其中某个位置…...
SAP系统控制检验批
问题:同一批物料多检验批问题 现象:同一物料多采购订单同一天到货时,对其采购订单分别收货,导致系统产生多个检验批,需分别请检单、检验报告等,使质量部工作复杂化。 原因:物料主数据质量试图设…...
JavaScript 代码混淆与反混淆技术详解
一、代码混淆:让别人看不懂你的代码 混淆技术就是一种“代码伪装术”,目的是让别人很难看懂你的代码逻辑,从而保护你的核心算法或敏感信息。 1. 变量名压缩 原理:把变量名改成乱码,比如把calculatePrice改成a&#…...
Android studio | From Zero To One ——手机弹幕
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 滚动显示 代码activity_main.xmlactivity_fullscreen.xmlAndroidManife…...
面向对象的需求分析与UML构造块详解
目录 前言1 面向对象的需求分析概述2 UML构造块概述3 UML事物详解3.1 结构事物(Structural Things)3.2 行为事物(Behavioral Things)3.3 分组事物(Grouping Things)3.4 解释事物(Annotational T…...
LeetCode 2843.统计对称整数的数目:字符串数字转换
【LetMeFly】2843.统计对称整数的数目:字符串数字转换 力扣题目链接:https://leetcode.cn/problems/count-symmetric-integers/ 给你两个正整数 low 和 high 。 对于一个由 2 * n 位数字组成的整数 x ,如果其前 n 位数字之和与后 n 位数字…...
RocketMQ深度百科全书式解析
一、核心架构与设计哲学 1. 设计目标 海量消息堆积:单机支持百万级消息堆积,适合大数据场景(如日志采集)。严格顺序性:通过队列分区(Queue)和消费锁机制保证局部顺序。事务…...
A2A与MCP Server:AI智能体协作与工具交互的核心协议对比
A2A与MCP Server:AI智能体协作与工具交互的核心协议对比 摘要 在AI智能体技术爆发式增长的今天,谷歌的A2A协议与Anthropic的MCP协议正在重塑AI系统架构。本文通过协议栈分层模型、企业级架构设计案例及开发者实践指南三大维度,揭示二者在AI生…...
如何将网页保存为pdf
要将网页保存为PDF,可以按照以下几种方法操作: 1. 使用浏览器的打印功能 大多数现代浏览器(如Chrome、Firefox、Edge等)都支持将网页保存为PDF文件。步骤如下: 在 Google Chrome 中: 打开你想保存为PDF…...
位运算与实战场景分析-Java代码版
一、为什么每个程序员都要掌握位运算? 在电商秒杀系统中,位运算可以快速判断库存状态;在权限管理系统里,位运算能用极小的空间存储复杂权限配置;在算法竞赛中,位运算更是高频出现的性能优化利器。这项看似…...
【“星睿O6”AI PC开发套件评测】+ Debian 系统安装及 sysbench 跑分对比
很荣幸这次可以得到机会评测 “星睿O6”AI PC开发套件。第一篇文章,我将分为两个部分: 官方 Debian 系统安装到 NVMEsysbench 跑分以及对比 RK3568 和 I712700KF 正文开始之前,忍不住还是想放几张开箱照片,板子实在是太精致了。…...
java——继承
继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。继承是指在原有类的基础上,进行功能扩展,创建新的类型。 概念与作用 代码复用:继承能够避免重…...
STM32嵌入式开发从入门到实战:全面指南与项目实践
STM32嵌入式开发从入门到实战:全面指南与项目实践 一、STM32开发基础概述 1.STM32微控制器核心特性 STM32微控制器基于ARM Cortex - M内核,具备显著的架构优势。其32位处理能力,能够高效处理复杂的计算任务,相较于传…...
企业数据孤岛如何破
企业数据孤岛如何破 背景信息传统方式Flink CDC如何用技术之力 背景信息 在数字化转型的浪潮中,企业数据的价值正从“事后分析”向“实时驱动”快速迁移。企业需要快速、高效地将分散在不同系统中的数据整合起来,以支持实时分析和业务决策。诚然&#x…...
源码编译安装Nginx
源码编译安装Nginx 源码编译安装Nginx创建nginx服务用户安装编译环境依赖包下载Nginx源码构建编译选项,创建makefile文件编译安装nginx为Nginx创建服务单元设置Nginx开机自启服务 yum安装Nginxyum安装openresty 源码编译安装Nginx 如果需要最新版本及定制化模块可以通过源码安…...
查看容器内的eth0网卡对应宿主机上的哪块网卡
查看容器内的eth0网卡对应宿主机上的哪块网卡 问题描述解决办法1. 进入容器,查看网卡的iflink(接口链路索引)值方法1:方法2: 2. 从宿主机过滤查询到的iflink(接口链路索引)值3. 确定veth接口连接的网桥方法2: brctl查看连接到网桥的接口--推荐 4. 查看网桥连接的物理网卡 问题描…...
虚拟偶像“C位出道”:数字浪潮下的崛起与财富密码(3/10)
摘要:虚拟偶像作为数字时代的新宠,凭借数字技术与文化创意的深度融合,在全球范围内迅速崛起。从早期的简单2D形象到如今高度逼真、智能交互的3D虚拟偶像,其发展得益于计算机图形学、动作捕捉、AI等技术的进步。虚拟偶像不仅在娱乐…...
swift菜鸟教程13(函数)
一个朴实无华的目录 今日学习内容:1.Swift 函数1.1函数定义:使用关键字 func。1.2函数参数:以逗号分隔。1.3不带参数函数1.4元组作为函数返回值1.5没有返回值函数1.6函数参数名称1.6.1局部参数名1.6.2外部参数名 1.7可变参数1.8常量ÿ…...
MacOS红队常用攻击命令
MacOS红队常用攻击命令 1.自动化武器2.系统信息3.服务 & 内核信息4.快捷命令5.网络相关6.brew相关 / 软件包相关7.高权限命令8.创建一个管理员权限的后门用户 1.自动化武器 1、linPEAS LinPEAS 是一个脚本,用于在 Linux/Unix/MacOS 主机上搜索提权路径 2、me…...
无人机的振动与噪声控制技术!
一、振动控制技术要点 1. 振动源分析 气动振动:旋翼桨叶涡脱落(如叶尖涡干涉)、动态失速(Dynamic Stall)引发的周期性气动激振力(频率与转速相关)。 机械振动:电机偏心、传动轴不…...
如何使用 Spring Boot 实现分页和排序?
全文目录: 开篇语1. 创建 Spring Boot 项目2. 配置数据库连接3. 创建实体类4. 创建 Repository 接口5. 创建分页和排序服务6. 创建控制器7. 测试分页和排序请求示例:返回结果: 8. 总结 文末 开篇语 哈喽,各位小伙伴们,…...
浅谈编译型语言的运用
如大家所熟悉的,程序在执行之前需要一个专门的编译过程,把程序编译成机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了,程序执行效率高,依赖编译器,如 C/C、Golang 等,…...
知识了解02——了解pnpm+vite+turbo+monorepo的完整构建步骤(react子项目)
(1)初始化monorepo 1)创建项目目录并进入当前目录 2)初始化 pnpm 工作区,生成一个package.json文件 3)在项目根目录下创建 pnpm-workspace.yaml 文件,并定义工作区目录 (2)安装 Turborepo 1)安…...
MySQL 半同步复制,给数据找靠谱 “分身”
目录 一背景 二、MySQL 复制基础概念 为何需要 MySQL 复制 传统异步复制 半同步复制的诞生 三、MySQL 半同步复制原理详解 主要组件及作用 工作流程 半同步复制流程图 四、MySQL 半同步复制配置与代码示例 环境准备 主服务器配置 从服务器配置 示例说明 五、MyS…...
uniapp离线打包提示未添加videoplayer模块
uniapp中使用到video标签,但是离线打包放到安卓工程中,运行到真机中时提示如下: 解决方案: 1、把media-release.aar、weex_videoplayer-release.aar放到工程的libs目录下; 文档:https://nativesupport.dcloud.net.cn/…...
机器人零位标定修正流程介绍
如果想看运动学标定可以看看 机器人运动学参数标定, 一次性把运动学参数和零位标定等一起标定求解. 1. 零位标定 零位标定是机器人运动学标定中的一个重要步骤,其目的是校正机器人关节的初始位置误差。以下是需要进行零位标定的主要原因: 制造误差 在机…...
应用层通信报文设计
/* --------------------------------------------------------------- | 魔数 2byte | 协议版本号 1byte | 序列化算法 1byte | 报文类型 1byte | --------------------------------------------------------------- | 状态 1byte | 保留字段 4byte | 数据长…...
一周学会Pandas2 Python数据处理与分析-Pandas2读取Excel
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Excel格式文件是办公使用和处理最多的文件格式之一,相比CSV文件,Excel是有样式的。Pandas2提…...
技术分享|iTOP-RK3588开发板Ubuntu20系统旋转屏幕方案
iTOP-3588开发板采用瑞芯微RK3588处理器,是全新一代AloT高端应用芯片,采用8nmLP制程,搭载八核64位CPU,四核Cortex-A76和四核Cortex-A55架构,主频高达2.4GHz。是一款可用于互联网设备和其它数字多媒体的高性能产品。 在…...
ubuntu 20.04 安装源码编译 ros humble过程
公司要兼容ros1还需要ros2 这个时候不得不使用ubuntu20.04 安装 humble 但实际上在20.04上安装humble是需要在源码编译的。 根据这个帖子 https://blog.csdn.net/m0_62353836/article/details/129730981 重写一份,以应对无法下载的问题 系统配置 #检查是否为UTF-8编码,是则跳…...
Ubuntu18.04.06安装window虚拟机,安装VirtualBox
VirtualBox官网没有支持Ubuntu18的版本,最低是ubuntu20; 但是现在用的系统是UBuntu18.04.06,又不能升级,查阅了很多办法,最终终于安装VirtualBox可用版本; 1,在Ubuntu18自带的软件应用市场,搜VirtualBox;…...
Matlab 四分之一车体被动悬架、pid、模糊控制和模糊pid控制
1、内容简介 Matlab 198-四分之一车体被动悬架、pid、模糊控制和模糊pid控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
Linux-----驱动
一、内核驱动与启动流程 1. Linux内核驱动 Nor Flash: 可线性访问,有专门的数据及地址总线(与内存访问方式相同)。 Nand Flash: 不可线性访问,访问需要控制逻辑(软件)。 2. Linux启动流程 ARM架构: IRAM…...
用HTML和CSS绘制佩奇:我不是佩奇
在这篇博客中,我将解析一个完全使用HTML和CSS绘制的佩奇(Pig)形象。这个项目展示了CSS的强大能力,仅用样式就能创造出复杂的图形,而不需要任何图片或JavaScript。 项目概述 这个名为"我不是佩奇"的项目是一个纯CSS绘制的卡通猪形象…...
Qwen2.5-7B-Instruct FastApi 部署调用教程
1 环境准备 基础环境最低要求说明: 环境名称版本信息1Ubuntu22.04.4 LTSCudaV12.1.105Python3.12.4NVIDIA CorporationRTX 3090 首先 pip 换源加速下载并安装依赖包 # 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set g…...
潇洒浪: Dify 上传自定义文件去除内容校验 File validation failed for file: re.json
Dify上传文件 添加其他文件类型如 my.myselfsuffix 上传成功 执行报错 File validation failed for file: re.json 解决办法 Notepad 搜索dify源码 注释掉,重启容器 或者直接在容器中修改重启...
【力扣hot100题】(088)最长有效括号
这题目真是越做越难了。 但其实只是思路很难想到,一旦会了方法就很好做。 但问题就在方法太难想了…… 思路还是只要遍历一遍数组,维护动态规划数组记录截止至目前位置选取该元素的情况下有效括号的最大值。 光是知道这个还不够,看了答案…...