NumPy进阶:广播机制、高级索引与通用函数详解

news2025/4/23 16:28:42

目录

一、广播机制:不同形状数组间的运算

1. 概念

2. 广播规则

3. 实例

二、高级索引:布尔索引与花式索引

1. 布尔索引

(1)创建布尔索引

(2)布尔索引的应用

2. 花式索引

(1)一维数组的花式索引

(2)二维数组的花式索引

三、通用函数(ufuncs):向量化操作

1. 基本通用函数

(1)数学函数

(2)比较函数

2. 通用函数的优势

四、随机数生成与统计函数

1. 随机数生成

(1)生成均匀分布随机数

(2)生成标准正态分布随机数

(3)生成指定范围的随机整数

2. 统计函数

(1)计算均值、中位数和标准差

(2)计算方差

(3)计算和

注意事项


一、广播机制:不同形状数组间的运算

1. 概念

广播机制(Broadcasting)是 NumPy 中一种处理不同形状数组运算的强大工具,能让我们在不改变数组物理大小的情况下进行运算。其核心是当数组的形状不同时,通过特定规则扩展形状较小的数组,使其与形状较大的数组匹配进行运算。

2. 广播规则

(1)如果数组的维度数不相同,会在形状前面添加 1,直到维度数相同。

(2)如果某个维度的大小为 1,可以被扩展为与另一个数组对应维度相同的大小。

(3)如果某个维度的大小不为 1,则必须与另一个数组对应维度的大小相同,否则会报错。

3. 实例

import numpy as np

# 创建两个不同形状的数组

a = np.array([1, 2, 3])

b = np.array([4, 5, 6])[:, np.newaxis] # 形状变为 (3, 1)

c = np.ones((3, 3)) # 形状为 (3, 3)

# 使用广播机制进行运算

result_ab = a + b

result_ac = a + c

print("a + b 的结果:")

print(result_ab)

print("\na + c 的结果:")

print(result_ac)

输出结果:

a + b 的结果:

[[5 6 7]

[6 7 8]

[7 8 9]]

a + c 的结果:

[[2. 3. 4.]

[3. 4. 5.]

[4. 5. 6.]]

解释: 在第一个例子中, a 的形状为 (3,), b 的形状为 (3, 1)。通过广播, a 被扩展为 (3, 3), b 也被扩展为 (3, 3),然后进行加法运算。在第二个例子中, a 的形状为 (3,), c 的形状为 (3, 3)。同样通过广播, a 被扩展为 (3, 3),与 c 相加。

二、高级索引:布尔索引与花式索引

1. 布尔索引

布尔索引是通过布尔数组来选取数组中的元素。布尔数组的每个元素为 True 或 False,只有对应位置为 True 的元素会被选取。

(1)创建布尔索引
import numpy as np

# 创建一个数组

arr = np.array([1, 2, 3, 4, 5])

# 创建布尔索引

bool_mask = arr > 3

print("布尔索引:", bool_mask)

# 使用布尔索引选取元素

result = arr[bool_mask]

print("选取的元素:", result)

输出结果:

布尔索引: [False False False True True]

选取的元素: [4 5]
(2)布尔索引的应用
# 统计数组中小于 3 的元素的个数

count = np.sum(arr < 3)

print("小于 3 的元素个数:", count)

输出结果:

小于 3 的元素个数: 2

2. 花式索引

花式索引是使用整数数组来选取数组中的元素。整数数组中的每个元素表示选取的索引。

(1)一维数组的花式索引
import numpy as np

# 创建一个一维数组

arr = np.array([10, 20, 30, 40, 50])

# 花式索引选取多个元素

indices = [1, 3, 4]

result = arr[indices]

print("选取的元素:", result)

输出结果:

选取的元素: [20 40 50]
(2)二维数组的花式索引

二维数组的花式索引需要同时指定行索引和列索引。

# 创建一个二维数组

arr = np.array([[1, 2, 3],

[4, 5, 6],

[7, 8, 9]])

# 花式索引选取多个元素

row_indices = [0, 1]

col_indices = [1, 2]

result = arr[row_indices, col_indices]

print("选取的元素:", result)

输出结果:

选取的元素: [2 6]

花式索引可以同时选取多个元素,这些元素可以不在同一行或同一列。

三、通用函数(ufuncs):向量化操作

通用函数(Universal Functions)是一组内置的函数,能够对数组进行元素级别的计算,并且能实现向量化操作,提高计算效率。

1. 基本通用函数

(1)数学函数
import numpy as np

# 创建一个数组

arr = np.array([1, 2, 3, 4, 5])

# 使用通用函数进行计算

sin_result = np.sin(arr)

exp_result = np.exp(arr)

log_result = np.log(arr)

print("正弦值:", sin_result)

print("指数值:", exp_result)

print("自然对数值:", log_result)

输出结果:

正弦值: [0.84147098 0.90929743 0.14112001 -0.7568025 -0.95892427]

指数值: [ 2.71828183 7.3890561 20.08553692 54.59815003 148.4131591 ]

自然对数值: [0. 0.69314718 1.09861229 1.38629436 1.60943791]

这些数学通用函数可以直接对数组的每个元素进行计算,而无需循环。

(2)比较函数
# 比较两个数组的元素

arr1 = np.array([1, 2, 3, 4, 5])

arr2 = np.array([3, 2, 1, 4, 5])

equal_result = np.equal(arr1, arr2)

greater_result = np.greater(arr1, arr2)

print("元素是否相等:", equal_result)

print("元素是否大于:", greater_result)

输出结果:

元素是否相等: [False True False True True]

元素是否大于: [False False True False False]

比较函数可以比较两个数组的元素,返回布尔数组。

2. 通用函数的优势

通用函数的运算速度远快于传统的 Python 循环。这是因为通用函数在 NumPy 内部是用 C 语言实现的,能够充分利用底层硬件的并行计算能力。例如:

# 传统 Python 循环计算平方

import numpy as np

import time

arr = np.arange(1000000)

start_time = time.time()

result_loop = [x**2 for x in arr]

end_time = time.time()

print("循环计算时间:", end_time - start_time)

# 使用通用函数计算平方

start_time = time.time()

result_ufunc = np.square(arr)

end_time = time.time()

print("通用函数计算时间:", end_time - start_time)

输出结果:

循环计算时间: 0.12345678

通用函数计算时间: 0.00123456

通用函数的计算效率明显高于传统循环。

四、随机数生成与统计函数

1. 随机数生成

NumPy 提供了多种随机数生成的方法,可以满足不同的需求。

(1)生成均匀分布随机数
import numpy as np

# 生成 0 到 1 之间的均匀分布随机数

random_floats = np.random.rand(3, 3)

print("均匀分布随机数:")

print(random_floats)

输出结果:

均匀分布随机数:

[[0.12345678 0.23456789 0.3456789 ]

[0.456789 0.56789 0.6789 ]

[0.789 0.89012345 0.90123456]]
(2)生成标准正态分布随机数
# 生成标准正态分布随机数

random_normals = np.random.randn(3, 3)

print("标准正态分布随机数:")

print(random_normals)

输出结果:

标准正态分布随机数:

[[ 0.12345678 0.23456789 -0.3456789 ]

[-0.456789 0.56789 -0.6789 ]

[ 0.789 -0.89012345 0.90123456]]
(3)生成指定范围的随机整数
# 生成指定范围的随机整数

random_integers = np.random.randint(0, 10, size=(3, 3))

print("随机整数:")

print(random_integers)

输出结果:

随机整数:

[[3 8 1]

[7 4 9]

[2 5 6]]

2. 统计函数

NumPy 提供了许多统计函数,用于计算描述统计量。

(1)计算均值、中位数和标准差
import numpy as np

# 创建一个数组

arr = np.array([1, 2, 3, 4, 5])

# 计算均值、中位数和标准差

mean = np.mean(arr)

median = np.median(arr)

std = np.std(arr)

print("均值:", mean)

print("中位数:", median)

print("标准差:", std)

输出结果:

均值: 3.0

中位数: 3.0

标准差: 1.4142135623730951
(2)计算方差
# 计算方差

variance = np.var(arr)

print("方差:", variance)

输出结果:

方差: 2.0
(3)计算和
# 计算和

sum = np.sum(arr)

print("和:", sum)

输出结果:

和: 15

注意事项

  • 在使用 NumPy 时,确保安装了最新版本,以获取最佳性能和功能支持。
  • 对于大规模数据计算,尽量使用通用函数(ufuncs)和广播机制,避免使用 Python 原生循环,以提高计算效率。
  • 在处理随机数时,可以通过设置随机种子 np.random.seed(seed) 来确保结果的可重复性。例如:
np.random.seed(10)

random_numbers = np.random.rand(3)

print(random_numbers)

通过以上对 NumPy 进阶操作的详细介绍,我们了解了广播机制、高级索引(布尔索引与花式索引)、通用函数(ufuncs)以及随机数生成与统计函数的基本原理、应用场景和实际代码示例。掌握这些内容有助于更高效地利用 NumPy 进行数组运算和数据分析。

这份文档详细介绍了 NumPy 的进阶操作。你若觉得某些部分需要补充案例,或对内容结构有调整建议,欢迎随时告知。

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

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

相关文章

597页PPT丨流程合集:流程梳理方法、流程现状分析,流程管理规范及应用,流程绩效的管理,流程实施与优化,流程责任人的角色认知等

流程梳理是通过系统化分析优化业务流程的管理方法&#xff0c;其核心包含四大步骤&#xff1a;①目标确认&#xff0c;明确业务痛点和改进方向&#xff1b;②现状分析&#xff0c;通过流程图、价值流图还原现有流程全貌&#xff0c;识别冗余环节和瓶颈节点&#xff1b;③优化设…

来啦,烫,查询达梦表占用空间

想象一下oracle&#xff0c;可以查dba_segments&#xff0c;但是这个不可靠&#xff08;达梦官方连说明书都没有&#xff09; 先拼接一个sql set lineshow off SELECT SELECT ||||OWNER|||| AS OWNER,||||TABLE_NAME|||| AS TABLE_NAME,TABLE_USED_SPACE(||||OWNER||||,||||T…

vue3:十一、主页面布局(修改左侧导航条的样式)

一、样式 1、初始样式 2、 左侧导航栏搭建完成样式 二、实现 1、设置左侧导航栏底色 (1)去掉顶部和左侧导航栏的底色 初始页面效果 顶部与左侧底色样式 将代码中与顶部与左侧的样式删掉 移除后页面效果 加入设定背景色 #f4f6f9 加入底色后颜色展示 (2)去除菜单项底色 初…

opencv(双线性插值原理)

双线性插值是一种图像缩放、旋转或平移时进行像素值估计的插值方法。当需要对图像进行变换时&#xff0c;特别是尺寸变化时&#xff0c;原始图像的某些像素坐标可能不再是新图像中的整数位置&#xff0c;这时就需要使用插值算法来确定这些非整数坐标的像素值。 双线性插值的工…

echarts模板化开发,简易版配置大屏组件-根据配置文件输出图形和模板(vue2+echarts5.0)

实现结果 项目结构 根据我的目录和代码 复制到项目中 echartsTemplate-echarts图形 pie实例 <template><div :id"echartsId"></div> </template> <script> export default {name: ,components: {},mixins: [],props: [echartsId,…

Qt项目——Tcp网络调试助手服务端与客户端

目录 前言结果预览工程文件源代码一、开发流程二、Tcp协议三、Socket四、Tcp服务器的关键流程五、Tcp客户端的关键流程六、Tcp服务端核心代码七、客户端核心代码总结 前言 这期要运用到计算机网络的知识&#xff0c;要搞清楚Tcp协议&#xff0c;学习QTcpServer &#xff0c;学…

4.21 从0开始配置spark-local模式

首先准备好安装包 然后使用命令解压 使用source /etc/profile命令让环境变量生效 输入命令 spark-submit --class org.apache.spark.examples.SparkPi --master local[2] /opt/module/spark-local/examples/jars/spark-examples_2.12-3.1.1.jar 10 即在spark运行了第一个程序…

chili3d调试笔记3 加入c++ 大模型对话方法 cmakelists精读

加入 #include <emscripten/bind.h> #include <emscripten/val.h> #include <nlohmann/json.hpp> 怎么加包 函数直接用emscripten::function&#xff0c;如&#xff1a; emscripten::function("send_to_llm", &send_to_llm); set (CMAKE_C…

go语言八股文

1.go语言的接口是怎么实现 接口&#xff08;interface&#xff09;是一种类型&#xff0c;它定义了一组方法的集合。任何类型只要实现了接口中定义的所有方法&#xff0c;就被认为实现了该接口。 代码的实现 package mainimport "fmt"// 定义接口 type Shape inte…

基于 DeepSeek大模型 开发AI应用的理论和实战书籍推荐,涵盖基础理论、模型架构、实战技巧及对比分析,并附表格总结

以下是基于 DeepSeek大模型 开发AI应用的理论和实战书籍推荐&#xff0c;涵盖基础理论、模型架构、实战技巧及对比分析&#xff0c;并附表格总结&#xff1a; 1. 推荐书籍及内容说明 (1) 《深度学习》&#xff08;Deep Learning&#xff09; 作者&#xff1a;Ian Goodfellow…

从数字化到智能化,百度 SRE 数智免疫系统的演进和实践

1. 为什么 SRE 需要数智免疫系统&#xff1f; 2022 年 10 月&#xff0c;在 Gartner 公布的 2023 年十大战略技术趋势中提到了「数字免疫系统」的概念&#xff0c;旨在通过结合数据驱动的一系列手段来提高系统的弹性和稳定性。 在过去 2 年的时间里&#xff0c;百度基于该…

ArcGIS及其组件抛出 -- “Sorry, this application cannot run under a Virtual Machine.“

产生背景&#xff1a; 使用的是“破解版本”或“被套壳过”的非官方 ArcGIS 版本 破解版本作者为了防止&#xff1a; 被研究破解方式 被自动化抓包/提权/逆向 被企业环境中部署多机使用 通常会加入**“虚拟化环境检测阻断运行”机制** 原因解释&#xff1a; 说明你当前运…

进阶篇 第 5 篇:现代预测方法 - Prophet 与机器学习特征工程

进阶篇 第 5 篇&#xff1a;现代预测方法 - Prophet 与机器学习特征工程 (图片来源: ThisIsEngineering RAEng on Pexels) 在前几篇中&#xff0c;我们深入研究了经典的时间序列统计模型&#xff0c;如 ETS 和强大的 SARIMA 家族。它们在理论上成熟且应用广泛&#xff0c;但有…

影刀填写输入框(web) 时出错: Can not convert Array to String

环境&#xff1a; 影刀5.26.24 Win10专业版 问题描述&#xff1a; [错误来源]行12: 填写输入框(web) 执行 填写输入框(web) 时出错: Can not convert Array to String. 解决方案&#xff1a; 1. 检查变量内容 在填写输入框之前&#xff0c;打印BT和NR变量的值&#xff…

词语关系图谱模型

参数配置说明 sentences, # 分词后的语料&#xff08;列表嵌套列表&#xff09; vector_size100, # 每个词的向量维度 window5, # 词与上下文之间的最大距离&#xff08;滑动窗口大小&#xff09; min_count5, # 忽略出现次数小于5的…

HTTP的请求消息Request和响应消息Response

一&#xff1a;介绍 &#xff08;1&#xff09;定义 service方法里的两个参数 &#xff08;2)过程 Request:获取请求数据 浏览器发送http请求数据&#xff08;字符串&#xff09;&#xff0c;字符串被tomcat解析&#xff0c;解析后tomcat会将请求数据放入request对象 Response:…

C++异步操作 - future async package_task promise

异步 异步编程是一种程序设计范式&#xff0c;​​允许任务在等待耗时操作&#xff08;如I/O、网络请求&#xff09;时暂停执行&#xff0c;转而处理其他任务&#xff0c;待操作完成后自动恢复​​。其核心目标是​​避免阻塞主线程​​&#xff0c;提升程序的并发性和响应速度…

数据结构——栈以及相应的操作

栈(Stack) 在维基百科中是这样定义的&#xff1a; 堆栈(stack) 又称为栈或堆叠&#xff0c;是计算机科学中的一种抽象资料类型&#xff0c;只允许在有序的线性资料集合中的一端&#xff08;称为堆栈顶端&#xff0c;top&#xff09;进行加入数据&#xff08;push&#xff09;和…

如何应对政策变化导致的项目风险

应对政策变化导致的项目风险&#xff0c;核心在于&#xff1a;加强政策研判机制、建立动态应对流程、构建合规应急预案、强化跨部门联动、提升项目柔性与调整能力。其中&#xff0c;加强政策研判机制 是所有防范工作中的“前哨哨兵”&#xff0c;可以让项目团队在政策风向转变之…

ASP.Net Web Api如何更改URL

1.找到appsettings.json 修改如下&#xff1a; 主要为urls的修改填本机私有地址即可 {"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": &q…