NumPy(Numerical Python)是 Python 中用于科学计算的基础库,提供了高性能的多维数组对象、矩阵运算以及大量数学函数库。其核心优势在于通过向量化操作替代传统循环,大幅提升计算效率,尤其适合处理大规模数据的算法实现。以下从算法核心、常用操作及经典算法案例展开介绍:

一、NumPy 算法核心:向量化与广播机制

1. 向量化运算(Vectorization)
  • 定义:无需循环即可对数组执行批量数学操作,底层由 C 语言实现,效率远高于 Python 循环。
  • 示例
  • mport numpy as np
    # 传统循环计算数组平方
    arr = np.array([1, 2, 3, 4])
    result1 = []
    for x in arr:result1.append(x ** 2)
    # 向量化计算
    result2 = arr ** 2  # 直接对数组所有元素平方
  • 优势:避免 Python 解释器的循环开销,计算速度提升 10-100 倍。
2. 广播机制(Broadcasting)
  • 定义:允许不同形状的数组进行运算时自动扩展维度,简化矩阵运算逻辑。
  • 规则
    1. 从后往前比较数组维度,维度小的数组自动填充至与维度大的数组一致;
    2. 若某维度为 1,则沿该维度复制扩展。
  • 示例
    a = np.array([[1, 2], [3, 4]])  # 形状(2,2)
    b = np.array([10, 20])         # 形状(2,)
    c = a + b  # 广播后b变为[[10,20],[10,20]],结果形状(2,2)

二、NumPy 常用算法操作

1. 数组运算算法
  • 数学函数np.sin()np.exp()np.log()(对数组元素逐元素计算)。
  • 统计函数np.mean()(均值)、np.std()(标准差)、np.percentile()(分位数)。
  • 线性代数np.dot()(矩阵乘法)、np.linalg.inv()(矩阵求逆)、np.linalg.eig()(特征值分解)。
2. 排序与搜索算法
  • 排序np.sort()(返回排序后数组)、np.argsort()(返回排序索引)。
  • 搜索np.where(arr > 0)(查找满足条件的元素索引)、np.searchsorted()(二分查找插入位置)。
3. 傅里叶变换(FFT)
  • 函数np.fft.fft()(快速傅里叶变换)、np.fft.ifft()(逆变换),用于信号处理、图像处理等。
  • 示例
t = np.linspace(0, 1, 1000)
signal = np.sin(2*np.pi*50*t) + 0.5*np.sin(2*np.pi*100*t)
fft_result = np.fft.fft(signal)
freq = np.fft.fftfreq(len(t), t[1]-t[0])  # 计算频率轴
4. 随机数生成与统计模拟
  • 分布采样np.random.normal()(正态分布)、np.random.binomial()(二项分布)。
  • 蒙特卡洛模拟:通过大量随机样本估算复杂问题,如用np.random.uniform()生成均匀随机数计算 π 值。

三、经典算法案例:从原理到 NumPy 实现

1. 线性回归(最小二乘法)
  • 原理:通过最小化误差平方和拟合线性模型 y=β0​+β1​x。
  • NumPy 实现
  • def linear_regression(x, y):# 添加截距项X = np.column_stack((np.ones_like(x), x))# 最小二乘法公式:β = (X^T X)⁻¹ X^T ybeta = np.linalg.inv(X.T @ X) @ X.T @ yreturn beta# 示例数据
    x = np.array([1, 2, 3, 4, 5])
    y = np.array([2.1, 3.9, 5.2, 7.0, 8.9])
    beta = linear_regression(x, y)  # 输出截距和斜率
2. K 最近邻(KNN)算法
  • 原理:通过计算样本与训练数据的距离,取最近的 K 个样本的标签进行投票分类。
  • NumPy 实现(简化版)
  • class KNN:def __init__(self, k=3):self.k = kdef fit(self, X, y):self.X_train = Xself.y_train = ydef predict(self, X_test):predictions = []for x in X_test:# 计算欧氏距离distances = np.sqrt(np.sum((self.X_train - x) **2, axis=1))# 取最近的k个样本的标签nearest_idx = np.argsort(distances)[:self.k]nearest_labels = self.y_train[nearest_idx]# 投票(取出现最多的标签)pred = np.bincount(nearest_labels).argmax()predictions.append(pred)return np.array(predictions)
3. 快速排序(向量化优化)
  • 传统递归实现:效率受 Python 循环限制;
  • NumPy 向量化思路:利用布尔索引替代递归划分。
  • 示例(非完整实现)
  • def vectorized_quicksort(arr):if len(arr) <= 1:return arrpivot = arr[0]# 向量化划分less = arr[arr < pivot]equal = arr[arr == pivot]greater = arr[arr > pivot]return np.concatenate([vectorized_quicksort(less), equal, vectorized_quicksort(greater)])

四、NumPy 算法优化技巧

  1. 避免频繁创建数组
    np.zeros()预分配内存,替代多次np.append()

  2. result = np.zeros((1000, 1000))  # 预分配
    for i in range(1000):result[i] = compute_row(i)  # 直接赋值
  1. 利用矩阵运算替代循环
    例如计算协方差矩阵时,用np.cov()替代手动循环累加。

  2. 使用 Numba 加速
    对计算密集型函数,用@numba.jit编译为机器码,进一步提升性能。

  3. import numba as nb@nb.jit(nopython=True)
    def compute_square(arr):return arr ** 2

 

  1. 并行计算
    结合np.parallel模块或 Dask 库,实现多线程 / 多节点数据处理。

五、NumPy 在算法领域的应用场景

  • 科学计算:物理模拟、数值积分(np.trapz)、微分方程求解。
  • 机器学习:特征工程(标准化np.std、归一化np.linalg.norm)、模型训练(矩阵运算)。
  • 数据分析:统计分析、信号处理(FFT)、图像处理(卷积np.convolve)。
  • 深度学习底层:TensorFlow、PyTorch 等框架的底层数组操作依赖 NumPy(或类似结构)。

 

 

 

 

 

 

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

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

相关文章

HarmonyOS优化应用文件上传下载慢问题性能优化

一、概述 在开发应用时&#xff0c;客户端与服务器之间数据交换的效率取决于文件传输的性能。一个数据交换性能较低的应用会导致其在加载过程中耗费较长时间&#xff0c;在很多的场景造成页面卡顿&#xff0c;极大的影响了用户体验。相反&#xff0c;一个数据交换高效的应用&a…

64、【OS】【Nuttx】任务休眠与唤醒:clock_nanosleep

背景 之前的 blog 63、【OS】【Nuttx】任务休眠与唤醒&#xff1a;sleep 分析了任务休眠中的 sleep 函数&#xff0c;下面继续来分析下 sleep 函数中的核心功能 clock_nanosleep clock_nanosleep usleep 上篇 blog 分析了 sleep 函数&#xff0c;其核心功能封装到了 clock_…

【生产实践】华为存储XSG1在RHEL 7.x/8.x上的多路径配置操作手册(生产环境)

一、概述 本手册针对Red Hat Enterprise Linux 7.x/8.x系统与华为XSG1存储设备的多路径I/O&#xff08;MPIO&#xff09;配置&#xff0c;通过优化路径策略实现高可用、负载均衡及故障容错&#xff0c;适配华为存储硬件特性&#xff0c;满足生产环境需求。 二、参数解析与配置…

Unity开发之Webgl自动更新程序包

之前让客户端更新webgl程序是在程序里写版本号然后和服务器对比&#xff0c;不同就调用 window.location.reload(true);之前做的客户端都是给企业用&#xff0c;用户数少看不出来啥问题。后来自己开发一个小网站&#xff0c;用户数量还是挺多&#xff0c;然后就会遇到各种各样的…

一个开源脚本,可自动安装在 AMD Radeon 7900XTX 上运行选定 AI 接口所需的所有内容

​一、软件介绍 文末提供程序和源码下载 一个开源脚本&#xff0c;可自动安装在 AMD Radeon 7900XTX 上运行选定 AI 接口所需的所有内容。 二、ROCm-AI-Installer ROCm-AI-安装程序 一个开源脚本&#xff0c;可自动安装在 AMD Radeon 7900XTX 上运行选定 AI 接口所需的所有内…

【Axure结合Echarts绘制图表】

1.绘制一个矩形&#xff0c;用于之后存放图表&#xff0c;将其命名为test&#xff1a; 2.新建交互 -> 载入时 -> 打开链接&#xff1a; 3.链接到URL或文件路径&#xff1a; 4.点击fx&#xff1a; 5.输入&#xff1a; javascript: var script document.createEleme…

Relooking:损失权重λ 、梯度权重α、学习率η

一般多任务&#xff0c;大家都喜欢叠加很多损失&#xff0c;由此产生很多损失权重系数。此外&#xff0c;有的学者直接对梯度进行操作。咋一看&#xff0c;上面三个系数貌似重复多余&#xff0c;直接用其中一个系数代替不行吗&#xff1f;为此&#xff0c;回顾了下神经网络的前…

数学复习笔记 20

复习方程组&#xff0c;还有随便复习一下高数和矩阵&#xff0c;向量。现在是复习高数的导数这一章。两个曲线相切&#xff0c;列出方程&#xff0c;然后解出参数&#xff0c;没有任何难度呢。算切线方程&#xff0c;就是&#xff0c;算导数&#xff0c;导数就用导数定义&#…

Sqlalchemy 连mssql坑

连接失败: (pyodbc.OperationalError) (08001, [08001] [Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [error:0A00014D:SSL routines::legacy sigalg disallowed or unsupported] (-1) (SQLDriverConnect)) (Background on this error at: https://sqlalche.me/e/…

AI大模型学习三十、ubuntu安装comfyui,安装插件,修改返回405 bug,值得一看喔

一、说明 ComfyUI是一个开源的、基于节点的Web应用。它允许用户根据一系列文本提示&#xff08;Prompt&#xff09;生成图像。 ComfyUI使用扩散模型作为基础模型&#xff0c;并结合 ControlNet、Lora和LCM低阶自适应等模型&#xff0c;每个工具都由程序中的一个节点表示 二、开…

MySQL(40)如何使用DROP TABLE删除表?

DROP TABLE 语句用于从数据库中永久删除一个表及其所有数据。执行该语句后&#xff0c;表结构和数据都将被彻底删除&#xff0c;且无法恢复。因此&#xff0c;在执行 DROP TABLE 操作之前&#xff0c;请确保已备份好相关数据。 基本语法 DROP TABLE table_name;如果要删除多个…

element ui 表格 勾选复选框后点击分页不保存之前的数据问题

element ui 表格 勾选复选框后点击分页不保存之前的数据问题 给 el-table上加 :row-key"getRowKey"给type“selection” 上加 :reserve-selection"true"

vite常见面试问题

一、Vite 核心原理 1. Vite 为什么比 Webpack 快? 答案: Vite 的核心优势在于开发环境和生产环境的双重优化: 开发环境: 基于原生 ESM(ES Modules):浏览器直接加载 ES 模块,无需打包,启动时间极短(毫秒级)。按需编译:仅编译当前页面所需的模块,而非整个项目。预…

Screen 连接远程服务器(Ubuntu)

连接 1. 安装screen 默认预安装&#xff0c;可以通过命令查看&#xff1a; screen --version 若未安装&#xff1a; # Ubuntu/Debian sudo apt-get install screen 2. 本机连接远程服务器 ssh root192.168.x.x 在远程服务器中打开screen&#xff1a; screen -S <nam…

Flutter GridView网格组件

目录 常用属性 GridView使用配置 GridView.count使用 GridView.extent使用 GridView.count Container 实现列表 GridView.extent Container 实现列表 GridView.builder使用 GridView网格布局在实际项目中用的也是非常多的&#xff0c;当我们想让可以滚动的元素使用矩阵…

Jenkins实践(8):服务器A通过SSH调用服务器B执行Python自动化脚本

Jenkins实践(8):服务器A通过SSH调用服务器B执行Python自动化脚本 1、需求: 1、Jenkins服务器在74上,Python脚本在196服务器上 2、需要在服务器74的Jenkins上调用196上的脚本执行Python自动化测试 2、操作步骤 第一步:Linux Centos7配置SSH免密登录 Linux Centos7配置S…

C#二维码:利用 ThoughtWorks.QRCode 库实现二维码生成与解析

C#二维码&#xff1a;利用 ThoughtWorks.QRCode 库实现二维码生成与解析 在当今数字化信息交互频繁的时代&#xff0c;二维码凭借其信息容量大、容错能力强、易识别等特点&#xff0c;广泛应用于各个领域。从移动支付、产品溯源到活动签到&#xff0c;二维码无处不在。在 C# 开…

【Java Web】速通JavaScript

参考笔记:JavaWeb 速通JavaScript_javascript 速通-CSDN博客 目录 一、JavaScript快速入门 1. 基本介绍 2. JavaScript特点 3. JavaScript的引入方式(重要) 3.1 写在script标签中 ​​​​​3.2 以外部文件方式引入 二、JS的数据类型 1. 变量 2. 常用数据类型 3.特殊值 三、…

Python打卡训练营-Day13-不平衡数据的处理

浙大疏锦行 知识点&#xff1a; 不平衡数据集的处理策略&#xff1a;过采样、修改权重、修改阈值交叉验证代码 过采样 过采样一般包含2种做法&#xff1a;随机采样和SMOTE 过采样是把少的类别补充和多的类别一样多&#xff0c;欠采样是把多的类别减少和少的类别一样 一般都是缺…

Mac OS 使用说明

Mac 的启动组合键 了解可通过在启动时按住一个或多个按键来访问的 Mac 功能和工具。 若要使用这些组合键中的任何一个&#xff0c;请在按下电源按钮以开启 Mac 后或在 Mac 开始重新启动后&#xff0c;立即按住相应按键。请一直按住&#xff0c;直至电脑出现对应的行为。 !!!上…