当前位置: 首页 > news >正文

基于 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.dtcms.com/a/292997.html

相关文章:

  • Navicat 远程连接SQLlite数据库
  • 前端学习日记(十)
  • 5G 智慧矿山监控终端
  • Python vs C++ 深度对比
  • 【实例】集团性企业数据整合指南:分子公司到总部的接入方案
  • 类加载过程及双亲委派模型
  • 木马派RV1106开发板驱动AIC8800DC USB蓝牙模块,用bluez-alsa库与蓝牙音箱配对并播放wav声音文件
  • 101.对称二叉树
  • 深入解析 Pandas:Python 数据分析的强大工具
  • 浅谈——C++和C#差异
  • 面试150 括号生成
  • 【3GPP】5G专用词汇1
  • 串口+DMA:固件库踩坑日记
  • 开发者的AI认知指南:用大模型重新理解人工智能(上)
  • Python排序算法全解析
  • Spring 核心知识点梳理 1
  • 【Lucene】架构
  • POSIX系统介绍
  • 【小白量化智能体】应用6:根据通达信指标等生成机器学习Python程序
  • A316-LS-MIC-V2:USB AI直播麦克风评估板技术解析
  • Linux——进程间通信,匿名管道,进程池
  • Spring AI 系列之二十 - Hugging Face 集成
  • 轩辕杯2025 Pwn baby_heap WP(house_of_apple2)
  • FFMPEG 解码流程 硬解码
  • 从零构建实时通信引擎:Freeswitch源码编译与深度优化指南
  • netty的编解码器,以及内置的编解码器
  • Linux系统权限全面解析:掌握你的数字王国钥匙
  • Python 链接各种中间件[Mysql\redis\mssql\tdengine]
  • 数据结构01:链表
  • FashionAI / 智尚衣橱 / TryFit / 智能时尚搭配平台