基于 NumPy 的高效数值计算技术解析与实践指引

在数据处理与科学计算领域,高效是核心诉求。NumPy 作为 Python 生态高效数值计算的基石,以高性能多维数组对象及配套函数,成为数据从业者的必备工具。其数组支持算术、比较、逻辑等丰富运算,通过向量化操作直接处理每个元素,无需循环,大幅提升代码效率与简洁度。

算术运算

NumPy 数组可以直接进行加减乘除等算术运算,运算规则是对应元素之间进行操作。

a = np.array([1, 2, 3, 4, 5])b = np.array([6, 7, 8, 9, 10])# 加法print(a + b) # 输出:[ 7 9 11 13 15]# 减法print(b - a) # 输出:[5 5 5 5 5]# 乘法print(a * b) # 输出:[ 6 14 24 36 50]# 除法print(b / a) # 输出:[6. 3.5 2.66666667 2.25 2. ]

此外,NumPy 还提供了丰富的数学函数来进行算术运算,如 np.add()、np.subtract()、np.multiply()、np.divide() 等,它们的功能与运算符类似。

print(np.add(a, b)) # 输出:[ 7 9 11 13 15],与 a + b 效果相同

比较运算

数组的比较运算会返回一个布尔类型的数组,其中每个元素表示对应位置的元素是否满足比较条件。

a = np.array([1, 3, 5, 7, 9])b = np.array([2, 3, 6, 7, 8])print(a > b) # 输出:[False False False False True]print(a == b) # 输出:[False True False True False]print(a <= b) # 输出:[ True True True True False]

逻辑运算

NumPy 提供了 np.logical_and()、np.logical_or()、np.logical_not() 等函数来进行逻辑运算。

a = np.array([True, True, False, False])b = np.array([True, False, True, False])print(np.logical_and(a, b)) # 输出:[ True False False False]print(np.logical_or(a, b)) # 输出:[ True True True False]print(np.logical_not(a)) # 输出:[False False True True]

广播机制

在 NumPy 中,形状不同的数组运算会触发广播机制,它能自动扩展小数组,实现元素级运算。

广播需遵循两条规则:

  1. 维度数不同时,给维度少的数组前面补维,直至维度数一致。
  1. 各维度上,数组大小相同或其中一个为 1 才能广播,否则报错。

广播示例如下:

# 示例 1:一维数组与标量运算a = np.array([1, 2, 3, 4, 5])b = 2print(a + b) # 输出:[3 4 5 6 7],标量 b 被广播为与 a 形状相同的数组 [2, 2, 2, 2, 2]# 示例 2:二维数组与一维数组运算a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])b = np.array([10, 20, 30])print(a + b)# 输出:# [[11 22 33]# [14 25 36]# [17 28 39]]# 一维数组 b 被广播为与 a 形状相同的二维数组 [[10, 20, 30], [10, 20, 30], [10, 20, 30]]# 示例 3:形状兼容的二维数组运算a = np.array([[1, 2], [3, 4], [5, 6]]) # 形状为 (3, 2)b = np.array([[10], [20], [30]]) # 形状为 (3, 1)print(a * b)# 输出:# [[ 10 20]# [ 60 80]# [150 180]]# 数组 b 被广播为形状 (3, 2) 的数组 [[10, 10], [20, 20], [30, 30]]

NumPy 的常用函数

NumPy 提供了大量的常用函数,用于数组的统计分析、数学计算等。

统计函数

  • np.sum():计算数组元素的总和。
a = np.array([[1, 2, 3], [4, 5, 6]])print(np.sum(a)) # 输出:21(所有元素的总和)print(np.sum(a, axis=0)) # 输出:[5 7 9](按列求和)print(np.sum(a, axis=1)) # 输出:[6 15](按行求和)
  • np.mean():计算数组元素的平均值。
a = np.array([1, 2, 3, 4, 5, 6])print(np.mean(a)) # 输出:3.5
  • np.max() 和 np.min():分别计算数组元素的最大值和最小值。
a = np.array([[7, 2, 9], [4, 8, 3]])print(np.max(a)) # 输出:9print(np.min(a, axis=0)) # 输出:[4 2 3](按列求最小值)
  • np.std() 和 np.var():分别计算数组元素的标准差和方差。
a = np.array([1, 2, 3, 4, 5])print(np.std(a)) # 输出:1.41421356...print(np.var(a)) # 输出:2.0

数学函数

  • np.sqrt():计算数组元素的平方根。
a = np.array([4, 9, 16, 25])print(np.sqrt(a)) # 输出:[2. 3. 4. 5.]
  • np.exp():计算数组元素的指数(e 的幂)。
a = np.array([1, 2, 3])print(np.exp(a)) # 输出:[ 2.71828183 7.3890561 20.08553692]
  • np.log()、np.log2()、np.log10():分别计算自然对数、以 2 为底的对数和以 10 为底的对数。
a = np.array([1, 2, 4, 10])print(np.log(a)) # 输出:[0. 0.69314718 1.38629436 2.30258509]print(np.log2(a)) # 输出:[0. 1. 2. 3.32192809]print(np.log10(a)) # 输出:[0. 0.30103 0.60205999 1. ]

其他常用函数

  • np.argmax() 和 np.argmin():分别返回数组中最大值和最小值的索引。
a = np.array([[3, 1, 4], [2, 5, 0]])print(np.argmax(a)) # 输出:4(最大值 5 在数组展平后的索引)print(np.argmin(a, axis=1)) # 输出:[1 2](按行找最小值的索引)
  • np.unique():返回数组中唯一的元素,并排序。
a = np.array([2, 1, 3, 2, 1, 4, 5, 4])print(np.unique(a)) # 输出:[1 2 3 4 5]
  • np.sort():对数组进行排序。
a = np.array([[3, 1, 4], [2, 5, 0]])print(np.sort(a)) # 输出:[[1 3 4] [0 2 5]](按行排序)print(np.sort(a, axis=0)) # 输出:[[2 1 0] [3 5 4]](按列排序)

NumPy 与其他库的结合

NumPy 作为 Python 科学计算的基础库,经常与其他库结合使用,发挥更强大的功能。

与 Matplotlib 结合

Matplotlib 是 Python 中常用的绘图库,它可以与 NumPy 无缝配合,绘制各种图表。

import numpy as npimport matplotlib.pyplot as plt# 生成数据x = np.linspace(0, 2 * np.pi, 100)y = np.sin(x)# 绘制正弦曲线plt.plot(x, y)plt.title('Sine Curve')plt.xlabel('x')plt.ylabel('sin(x)')plt.show()

与 Pandas 结合

Pandas 是基于 NumPy 构建的数据分析库,它的 Series 和 DataFrame 数据结构本质上都是基于 NumPy 的数组。在 Pandas 中,可以方便地将数据转换为 NumPy 数组进行处理。

import numpy as npimport pandas as pd# 创建 DataFramedf = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})# 转换为 NumPy 数组arr = df.valuesprint(arr)# 输出:# [[1 4]# [2 5]# [3 6]]

NumPy 的高级应用

除了上述基础内容,NumPy 还有许多高级应用,如线性代数运算、随机数生成等。

线性代数运算

NumPy 的 linalg 模块提供了丰富的线性代数运算函数。

  • np.linalg.dot():计算两个数组的点积。
a = np.array([[1, 2], [3, 4]])b = np.array([[5, 6], [7, 8]])print(np.linalg.dot(a, b))# 输出:# [[19 22]# [43 50]]
  • np.linalg.inv():计算矩阵的逆矩阵(仅适用于方阵)。
a = np.array([[1, 2], [3, 4]])inv_a = np.linalg.inv(a)print(inv_a)# 输出:# [[-2. 1. ]# [ 1.5 -0.5]]
  • np.linalg.eig():计算方阵的特征值和特征向量。
a = np.array([[1, 2], [3, 4]])eigenvalues, eigenvectors = np.linalg.eig(a)print("特征值:", eigenvalues) # 输出:特征值: [-0.37228132 5.37228132]print("特征向量:\n", eigenvectors)# 输出:特征向量:# [[-0.82456484 -0.41597356]# [ 0.56576746 -0.90937671]]

随机数生成

NumPy 的 random 模块提供了多种生成随机数的函数。

  • np.random.rand():生成 [0,1) 之间的随机数。
# 生成形状为 (2, 3) 的随机数组print(np.random.rand(2, 3))# 输出(每次运行结果可能不同):# [[0.4618034 0.01623568 0.85273445]# [0.49533646 0.89013761 0.97617472]]
  • np.random.randint():生成指定范围内的随机整数。
# 生成形状为 (3, 2),范围在 [1, 10) 的随机整数print(np.random.randint(1, 10, size=(3, 2)))# 输出(每次运行结果可能不同):# [[5 3]# [7 9]# [2 6]]
  • np.random.normal():生成符合正态分布的随机数。
# 生成形状为 (1, 5),均值为 0,标准差为 1 的正态分布随机数print(np.random.normal(0, 1, size=(1, 5)))# 输出(每次运行结果可能不同):# [[-0.3264997 -0.76003135 0.22776465 1.44944949 0.42473946]]

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

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

相关文章

Kafka MQ 控制器 broker

Kafka MQ 控制器 broker 1 控制器broker的选举 在 Kafka 集群中会有一个或多个 broker,其中有一个 broker 会被选举为控制器(Kafka Controller)​,它负责管理整个集群中所有分区和副本的状态。当某个分区的leader副本出现故障时,由控制器负责为该分区选举新的leader副本…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ImageCarousel(图片轮播组件)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— ImageCarousel组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 <script setup> 语法以及 Tailwind CSS …

基于springboot的智能物流管理系统(源码+论文)

一、开发环境 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器&#xff0c;基于SQL的客户/服务器模式的关系数据库管理系统。其特点包括&#xff1a; 功能强大&#xff1a;支持多用户、多线程操作。使用简单&#xff1a;管理方便&#xff0c;安全可靠性高。跨平…

Collection接口的详细介绍以及底层原理——包括数据结构红黑树、二叉树等,从0到彻底掌握Collection只需这篇文章

目录 Collection简介 Collection的遍历方式 迭代器遍历 增强for遍历 Lambda表达式遍历 List集合 List集合的遍历方式 列表迭代器遍历以及普通for循环 数据结构 栈 队列 数组 链表 单向链表 双向链表 二叉树 遍历方式 普通二叉树 二叉查找树 平衡二叉树 旋转…

《安顺棒垒球》世界十大运动·棒球1号位

Worlds Top 10 Sports for Newbies | 棒球排第几&#xff1f; 全球青训体系大揭秘 ⚾添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;神王棒球世界十大运动排名 Top 10 Global Sports&#xff08;按参与度/商业价值/影响力综合排序&#xff09;足球 Footba…

什么是“差分“?

1. 什么是"差分"&#xff1f;想象两个人在玩跷跷板&#xff1a;当两人同时向上跳&#xff08;同向移动&#xff09;→ 跷跷板不动 → 这叫"共模"当一人向上&#xff0c;另一人向下&#xff08;反向移动&#xff09;→ 跷跷板倾斜 → 这叫"差分"差…

4.组合式API知识点(2)

10 组合式API - 模版引用模板引用的概念如何使用&#xff08;以获取dom为例 组件同理&#xff09;组件实例对象defineExpose()11 组合式API - provide和inject作用和场景跨层传递普通数据跨层传递响应式数据跨层传递方法需求解决思考

GitLab企业版部署与许可证生成完整指南

GitLab企业版部署与许可证生成完整指南一、背景二、环境准备三、部署步骤1. 创建目录结构2. 生成GitLab许可证2.1 克隆许可证生成器2.2 修改生成器脚本2.3 构建Docker镜像2.4 生成许可证文件3. 创建Docker Compose配置文件4. 启动GitLab容器4.1 初始启动4.2 修改GitLab配置4.3 …

Jenkins 不同节点间文件传递:跨 Job 与 同 Job 的实现方法

在日常的 DevOps 运维实践中&#xff0c;Jenkins 通常被用于串联多个自动化流程&#xff0c;而这些流程往往需要在不同的构建节点&#xff08;agent&#xff09;上执行。例如&#xff0c;在以下场景中&#xff1a; &#x1f4cc; 场景需求描述&#xff08;实际问题&#xff09;…

Java中AQS原理

一、核心架构&#xff1a;AQS抽象队列同步器二、AQS核心机制1. 三大核心组件&#xff1a;state状态变量&#xff1a;volatile int&#xff0c;表示锁状态&#xff08;0未锁定&#xff0c;≥1锁定/重入次数&#xff09;CLH队列&#xff1a;双向链表实现的线程等待队列Node节点&a…

深入理解程序链接机制:静态链接、ELF加载与动态库实现原理

目录 一、静态链接 1、静态链接的基本概念 1. 静态链接实例分析 2. 目标文件分析 3. 关键观察 4. 重定位机制 5. 注意事项 2、静态链接过程详解 1. 目标文件反汇编分析&#xff08;上面已分析&#xff09; 2. 符号表分析 code.o 符号表 hello.o 符号表 3. 链接后的…

python基础复习

复习python基础语法,最好能做到使用python 写一些简单的算法。 1基础基础语法 1.0 输入输出 一个实用的print:format函数print(站点列表 {0}, {1}, 和 {other}。.format(Google, Runoob, other=Taobao)) 站点列表 Google, Runoob, 和 Taobao。print("a", "b…

ZLMediaKit 入门

什么是ZLMediaKit&#xff1f; ZLMediaKit 是一个基于C11的高性能流媒体服务器框架&#xff0c;支持RTSP/RTMP/HLS/HTTP-FLV/WebSocket-FLV等多种流媒体协议。它具有以下特点&#xff1a; 跨平台支持&#xff08;Linux、Windows、macOS&#xff09; 高性能&#xff0c;支持高…

接口测试Postman工具高级使用技巧

目录 一、环境与变量的深度应用 多环境动态切换 动态变量与脚本生成 二、Pre-request Script 的妙用 参数签名/加密 接口依赖处理 三、Test Script 的进阶断言 复杂 JSON Schema 校验 数据库断言 四、数据驱动测试 CSV/JSON 文件驱动 动态生成测试用例 环境与变量的…

ZooKeeper学习专栏(四):单机模式部署与基础操作详解

文章目录前言一、单机模式部署架构图部署流程&#xff1a;二、zkCli.sh命令行工具基础操作三、ACL权限控制实践学习资源前言 本文是Zookeeper学习系列的第四篇&#xff0c;将详细讲解Zookeeper的单机模式部署过程以及基础命令行操作&#xff0c;包括节点管理、Watcher机制和AC…

静态登录界面

代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用户登录</title><st…

Three.js 全景图(Equirectangular Texture)教程:从加载到球面映射

全景图(Equirectangular Texture)是一种特殊的 2D 图像,能通过数学转换模拟 360 环绕视角,常用于创建沉浸式环境(如虚拟全景、天空盒替代方案)。本文将通过完整示例,带你掌握 Three.js 中全景图的加载、映射原理与实际应用。 什么是全景图(Equirectangular Texture)?…

Rocky Linux 9 快速安装 Node.js

Rocky Linux 9 快速安装 Node.js 大家好&#xff0c;我是星哥&#xff01;今天给大家带来 Rocky Linux 9 环境下 Node.js 的安装教程。 本文将详细介绍两种安装方法&#xff0c;帮你快速搭建稳定的 Node.js 环境。 Node.js 是一个非常流行的 JavaScript 运行时环境&#xff…

.NET依赖注入IOC你了解吗?

IOC在Web API 中是经常使用的&#xff0c;但是在一些WPF项目并不是经常使用或者被人熟知的&#xff0c;我把相关依赖注入的内容又做了一次学习和整理什么是依赖注入&#xff1f; 依赖注入是一种设计模式和软件设计原则&#xff0c;用于实现 控制反转。它的核心思想是&#xff1…

Python----大模型(基于Fastapi+streamlit的机器人对话)

一、准备工作 1.1、魔搭社区下载大模型 通义千问2.5-7B-Instruct 模型库 from modelscope.hub.snapshot_download import snapshot_download llm_model_dir snapshot_download(Qwen/Qwen2.5-7B-Instruct,cache_dirmodels) 1.2、启动vllm大模型 python -m vllm.entrypoint…