深入了解 NumPy:深度学习中的数学运算利器

文章目录

      • 1. 导入NumPy
      • 2. 创建NumPy数组
      • 3. 数组的算术运算
      • 4. N维数组
        • 4.1 创建和操作多维数组
        • 4.2 高维数组
      • 5. NumPy的广播功能
        • 5.1 基本广播示例
        • 5.2 更复杂的广播示例
      • 6. 访问数组元素
        • 6.1 基于索引的访问
        • 6.2 遍历数组
        • 6.3 基于条件的访问
        • 6.4 高级索引
        • 6.5 性能考虑

在深度学习和数据科学的领域,数学运算尤为重要,而NumPy库则是Python中处理这些计算的核心工具。NumPy(Numerical Python的缩写)提供了一个强大的数组对象:numpy.ndarray,它是多维数组的核心,并带有大量的便捷方法,使得数学运算变得简洁而高效。

1. 导入NumPy

NumPy并不是Python标准库的一部分,需要单独安装和导入。在Python中,通过简单的导入声明可以轻松访问NumPy库:

import numpy as np

通过np这个别名来使用NumPy的各种功能,提高代码的可读性和易用性。

2. 创建NumPy数组

NumPy的核心功能之一是其数组处理能力。通过np.array()函数,可以将Python的列表转换成numpy.ndarray对象(即NumPy数组):

x = np.array([1.0, 2.0, 3.0])
print(x)
# 输出: [1. 2. 3.]

3. 数组的算术运算

NumPy数组支持元素级的算术运算,这意味着运算会应用到数组中的每一个元素上。

x = np.array([1.0, 2.0, 3.0])
y = np.array([2.0, 4.0, 6.0])

在NumPy中,进行基本运算如加法、减法、乘法和除法时,这些操作是按元素进行的:

print(x + y)  # 对应元素相加:[3. 6. 9.]
print(x - y)  # 对应元素相减:[-1. -2. -3.]
print(x * y)  # 对应元素相乘:[2. 8. 18.]
print(x / y)  # 对应元素相除:[0.5 0.5 0.5]

重要的是,进行这些操作的两个数组必须具有相同的形状或兼容的形状。如果形状不匹配,NumPy会尝试广播数组以匹配形状,如果无法广播,则会抛出一个错误(广播在后面有解释)

此外,NumPy也支持数组与标量之间的运算,这表现在所谓的广播(broadcast)特性上,允许小规模数据结构与大规模数据结构间进行算术运算:

print(x / 2.0)  # 每个元素除以2:[0.5 1.0 1.5]

4. N维数组

NumPy提供了强大的多维数组支持,这使其在科学计算中发挥了至关重要的作用。它能够处理从一维数组(向量)、二维数组(矩阵)到更高维度的数组(张量),用于表示各种复杂的数据结构。

4.1 创建和操作多维数组

以二维数组为例,可以轻松地创建和进行算术运算:

import numpy as np

# 创建一个2x2的二维数组
A = np.array([[1, 2], [3, 4]])
print(A)
# 输出:
# [[1 2]
#  [3 4]]

# 查看数组的形状和数据类型
print("Shape:", A.shape)  # Shape: (2, 2)
print("Data type:", A.dtype)  # Data type: int64

# 创建另一个2x2的二维数组
B = np.array([[3, 0], [0, 6]])

# 数组的加法和元素级乘法
print("A + B =", A + B)
# 输出:
# A + B = [[ 4  2]
#          [ 3 10]]
print("A * B =", A * B)
# 输出:
# A * B = [[ 3  0]
#          [ 0 24]]

在NumPy中,数组的算术运算是元素级的,意味着操作会在两个数组的相应元素间进行。此外,NumPy的广播功能允许执行如标量与数组之间的运算,这在实际应用中非常有用:

# 标量与数组的乘法
print("A * 10 =", A * 10)
# 输出:
# A * 10 = [[10 20]
#           [30 40]]
4.2 高维数组

NumPy的能力不限于一维或二维数组。它可以创建和操作任何高度的多维数组。例如,三维或更高维度的数组通常用于数据科学和机器学习中,处理如图像数据(宽度、高度、颜色通道)或时间序列数据(数据点、时间步长、特征数量):

# 创建一个3维数组
Z = np.array([[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
              [[10, 11, 12], [13, 14, 15], [16, 17, 18]],
              [[19, 20, 21], [22, 23, 24], [25, 26, 27]]])

print(Z)
# 可以访问特定的层、行、列
print("Access a specific element:", Z[1, 2, 0])  # 访问第二层,第三行,第一个元素(16)

5. NumPy的广播功能

NumPy的广播功能是其数组操作中一个非常强大的特性,允许在执行算术运算时自动扩展一个较小的数组以匹配一个较大数组的形状,无需显式复制数据。

5.1 基本广播示例

当使用标量与数组进行运算时,标量会被广播到数组的每个元素上:

import numpy as np

A = np.array([[1, 2], [3, 4]])
# 标量与二维数组的乘法
result = A * 10
print(result)
# 输出:
# [[10 20]
#  [30 40]]

在这里插入图片描述

在这个例子中,标量10被广播成与数组A相同的形状,然后与数组中的每个元素相乘。

5.2 更复杂的广播示例

广播功能也适用于维度不一致但兼容的数组之间。例如,当一维数组与二维数组相乘时,一维数组会沿着缺少的维度被扩展,以匹配较大的数组:

B = np.array([10, 20])
# 一维数组与二维数组的元素级乘法
result = A * B
print(result)
# 输出:
# [[10 40]
#  [30 80]]

在这里插入图片描述

一维数组B的每个元素被广播到了A的对应行上,使得乘法能够按元素执行。

6. 访问数组元素

NumPy数组提供了多种灵活的元素访问方法,这包括基于索引的访问以及基于条件的访问,极大地简化了数据操作和处理。

6.1 基于索引的访问

在NumPy数组中,每个元素的位置由从零开始的索引确定。可以通过指定位置的索引来访问单个数组元素,或者通过切片来访问数组的一个区段:

import numpy as np

X = np.array([[51, 55], [14, 19], [0, 4]])
print("第0行:", X[0])  # 访问第一行
# 输出: [51 55]
print("位置(0,1)的元素:", X[0][1])  # 访问第一行的第二个元素
# 输出: 55
6.2 遍历数组

NumPy数组也支持使用循环来遍历元素,例如使用for循环遍历每一行:

for row in X:
    print(row)
# 输出:
# [51 55]
# [14 19]
# [0 4]
6.3 基于条件的访问

NumPy支持使用条件表达式来选择数组中满足特定条件的元素。这种方法返回一个布尔数组,可以用于索引原数组:

# 找出所有大于15的元素
filtered = X[X > 15]
print("大于15的元素:", filtered)
# 输出: [51 55 19]
6.4 高级索引

NumPy允许使用数组索引来访问数据,这对于从数组中选择一个非连续的元素子集特别有用:

X_flat = X.flatten()  # 将X转换为一维数组
print("转换后的一维数组:", X_flat)
# 输出: [51 55 14 19 0 4]

indices = np.array([0, 2, 4])
selected_elements = X_flat[indices]  # 通过索引数组访问元素
print("选定索引的元素:", selected_elements)
# 输出: [51 14 0]
6.5 性能考虑

尽管Python是一种动态类型的语言,其运算速度通常不如C和C++这样的静态类型语言,但是NumPy的大部分数值计算都是用C或C++实现的。这意味着NumPy能够提供接近于编译型语言的性能,同时保持Python语言的灵活性和易用性。因此,使用NumPy可以在不牺牲性能的前提下,利用Python便捷的语法进行高效的数学和逻辑运算。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读_使用有向无环图实现流程工程_AgentKit

英文名称: AgentKit: Flow Engineering with Graphs, not Coding 中文名称: AgentKit:使用图而非编码进行流程工程 链接: https://arxiv.org/pdf/2404.11483.pdf 代码: https://github.com/holmeswww/AgentKit 作者: Yue Wu, Yewen Fan, So Yeon Min, Shrimai Prabh…

射频无源器件之耦合器

一. 耦合器的作用 在射频电路中,射频耦合器将一路微波功率按比例分成几路,用于检测或监测信号,如功率测量和波检测,还可改变信号的幅度、相位等特性,以满足不同的通信需求。根据输入与耦合端的功率差,常被分为5dB、6dB、10dB等耦合器。射频耦合器的类型主要包括定向耦合…

区块链 | NFT 相关论文:Preventing Content Cloning in NFT Collections(三)

🐶原文: Preventing Content Cloning in NFT Collections 🐶写在前面: 这是一篇 2023 年的 CCF-C 类,本博客只记录其中提出的方法。 F C o l l N F T \mathbf{F_{CollNFT}} FCollNFT​ and Blockchains with Native S…

命名空间、C++的输入输出、缺省参数(默认参数)、函数重载

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

基于Springboot的校园健康驿站管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的校园健康驿站管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系…

TMS320F2812DSP最小系统原理图及PCB文件

目录 1、原理图 2、PCB 资料下载地址:TMS320F2812DSP最小系统原理图及PCB文件 1、原理图 2、PCB

视频转GIF动图:一键批量操作技巧,轻松实现动态图像转换

在数字媒体时代,GIF动图因其小巧、循环播放的特性,在网络传播中占据了重要地位。而将视频转换为GIF动图,不仅可以快速捕捉视频中的精彩瞬间,还能为社交媒体、网站和博客等内容创作增添生动与活力。本文将介绍如何通过一键批量操作…

三、VGA接口驱动与图像显示动态移动

文章目录 一、参数介绍二、彩条显示2.1 模块系统架构框图2.2 行、场同步波形:2.3 代码三、VGA 图像显示动态移动3.1波形设计3.2代码 一、参数介绍 对于普通的 VGA 显示器,共有 5 个信号:R、G、B 三基色;HS(行同步信号&#xff09…

Mysql基础(五)外键约束

一 外键 激励: 每天进步一点点即可 ① 思考 1、在MySQL中,我们知道主键 PRIMARY KEY的主要作用是唯一区分表中的各个行 [记录];思考:但是对于外键 foreign key比较陌生? 那么外键作用以及限制条件和目的呢? ② 外键的定义 1、外键是某个表 A中…

第一天复习Qt文件读取

Qt文件操作: 1、QFile QTextStream操作文件案例: 1、打开文件 QFile file(absolute filepath | relative path); file.readLine()返回内容长度,如果为-1就是读取失败 file. Close()读取后关闭 file.errorString()返回文件打开发生的错误2、…

如何购买阿里云99计划的ECS云服务器?99元购买阿里云2核2G3M服务器教程

阿里云助力中小企业和开发者无忧上云的“99计划”中有两款性价比超高的ECS云服务器,2026年3月31日活动结束前新购和续费价格一样。 其中个人和企业新老用户同享的2核2G3M服务器仅需99元/年(续费同价),企业新老用户同学的2核4G5M仅…

外贸企业6大客户开发渠道优缺点全面解析 | 箱讯科技国际贸易综合服务平台

一、展会的重要性 展会,作为历史悠久的客户开发渠道,一直备受企业推崇。它汇聚了来自不同行业的企业,为大家提供了一个集中展示产品和技术的大舞台。在没有互联网的年代,展会几乎成为外贸交易的核心媒介。至今,它依然…

射频无源器件之巴伦

一. 巴伦的作用 Balun,balanced-unbalanced的缩写,即平衡-不平衡转换器,是一种三端口无源器件,其本质是通过电感线圈的相互耦合实现的信号转换。用于平衡信号(差分信号,即振幅相等、相位相差180 的两个信号)与非平衡信号(单端信号)的相互转换。 Balun是高频电路重要器…

《编译原理》阅读笔记:p1-p3

《编译原理》学习第 1 天,p1-p3总结,总计 3 页。 一、技术总结 1.compiler(编译器) p1, But, before a program can be run, it first must be translated into a form in which it can be executed by a computer. The software systems that do thi…

水面垃圾清理机器人的视觉算法研究

卷积神经网络是一种分层的数据表示模型,通常由数据输入层、卷积层、池化层、 非线性激活函数、全连接层以及输出结果预测层等组成,其中卷积层、池化层和非线 性激活函数是卷积神经网络中的重要组成部分。此外,有些模型会增加其他的层(归一 化…

16.接口自动化学习-编码处理与装饰器

1.编码和解码 编码:将自然语言翻译成计算机可以识别的语言 hello–01010 解码:将机器识别的语言翻译成自然语言 2.编码格式 UTF-8 GBK unicode 3.编码操作 #编码操作str1"hello呀哈哈哈"str2str1.encode(gbk)print(str2)print(type(str2))…

面试笔记——多线程使用场景

线程池使用场景(CountDownLatch, Future) CountDownLatch CountDownLatch(闭锁/倒计时锁)用来进行线程同步协作,等待所有线程完成倒计时(一个或者多个线程,等待其他多个线程完成某件…

漏扫神器Invicti V2024.4.0专业版

前言 Invicti Professional是Invicti Security公司推出的一个产品,它是一种高级的网络安全扫描工具。Invicti Professional旨在帮助组织发现和修复其网络系统中的潜在安全漏洞和弱点。它提供了全面的漏洞扫描功能,包括Web应用程序和网络基础设施的漏洞扫…

2024 GESP6级 编程第一题 游戏

题目描述 你有四个正整数 ,并准备用它们玩一个简单的小游戏。 在一轮游戏操作中,你可以选择将 减去 ,或是将 减去 。游戏将会进行多轮操作,直到当 时游戏结束。 你想知道游戏结束时有多少种不同的游戏操作序列。两种游戏操作…

[微信小程序] 入门笔记1-滚动视图组件

[微信小程序] 入门笔记1-滚动视图组件 1.页面&组件&渲染 在小程序是由一个个页面page组成, 而页面又是由一个个组件component组成.和网页类似,这里的组件指的就是输入框<input>,按钮<button>,文本<text>,图片<image>等元素.如果你学过网页一…
最新文章