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

news/2024/5/20 7:05:41

文章目录

      • 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 npA = 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 npX = 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.mrgr.cn/p/43571404

相关文章

Crowd counting 系列NO.2—MCNN

声明:博客是用latex写的,所以直接用图片来展示吧,效果是一样的。下载资源网上都很容易搜到,如需下载资源,请留言。

韩顺平0基础学Java——第5天

p72——p86 今天同学跟我说别学java,真的吗?唉,先把这视频干完吧。 逻辑运算符练习 x6,y6 x6,y5 x11,y6 x11,y5 z48 错了&a…

超级大转盘!(html+less+js)(结尾附代码)

超级大转盘!(结尾附代码) 网上看到有人用转盘抽奖,怀疑是不是有问题,为什么每次都中不了,能不能整个转盘自己想中啥中啥,查阅了网上写得好的文章,果然实现了只中谢谢参与&#xff0…

《21天学通C++》(第十二章)运算符类型与运算符重载

1.为什么要重载运算符&#xff1f; 通过重载运算符&#xff0c;可以将复杂的操作封装成简单的运算符形式&#xff0c;简化代码&#xff0c;提高可读性下面举一个简单的例子 计算两个点的坐标之和。 1.不重载运算符 #include <iostream> using namespace std; class P…

低功耗数字IC后端设计实现典型案例| UPF Flow如何避免工具乱用Always On Buffer?

下图所示为咱们社区低功耗四核A7 Top Hierarchical Flow后端训练营中的一个案例&#xff0c;设计中存在若干个Power Domain&#xff0c;其中Power Domain2(简称PD2)为default Top Domain&#xff0c;Power Domain1&#xff08;简称PD1&#xff09;为一个需要power off的domain&…

STM32单片机实战开发笔记-I2C通讯总线【wulianjishu666】

嵌入式单片机开发实战例程合集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11av8rV45dtHO0EHf8e_Q0Q?pwd28ab 提取码&#xff1a;28ab I2C模块测试 功能描述 I2C总线接口连接微控制器和串行I2C总线。它提供多主机功能&#xff0c;控制所有I2C总线特定的时序&am…

云HIS源码,基于云计算的医院临床信息系统(有应用案列)

云HIS全套商业源码&#xff0c;基于云计算的医院临床信息系统 提供预约挂号、门急诊收费、门诊医生站、护士工作站、药房药库管理、电子病历、住院医生站、住院护士工作站、住院登记结算、出院管理、病案管理、医药价格管理、财务管理、统计查询、会员管理等业务及管理功能。 …

【Android】Room数据库的简单使用方法

Room数据库的使用方法 目录 1、添加Room数据库的依赖2、Entity——定义实体类 2.1 定义主键——PrimaryKey2.2 字段注解——ColumnInfo 3、Dao——定义数据访问对象4、Database——数据库 4.1 通过回调观察数据库是否创建成功 5、使用时注意点6、编写异步 DAO 查询 6.1 写异步…

python作业五

题目&#xff1a;注册登录 制作一个注册登录模块 注册&#xff1a;将用户填入的账户和密码保存到一个文件(users.bin) 登陆&#xff1a;将用户填入账户密码和users.bin中保存的账户密码进行比对,如果账户和密码完全相同 那 么登录成功&#xff0c;否则登录失败…

Linux基础之git与调试工具gdb

目录 一、git的简单介绍和使用方法 1.1 git的介绍 1.2 git的使用方法 1.2.1 三板斧之git add 1.2.2 三板斧之git commit 1.2.3 三板斧之git push 二、gdb的介绍和一些基本使用方法 2.1 背景介绍 2.2 基本的使用方法 一、git的简单介绍和使用方法 1.1 git的介绍 Git是一…

国科大深度学习期末历年试卷

本文借鉴 国科大深度学习复习 深度学习期末 深度学习2020 一&#xff0e;名词解释&#xff08;每个2分&#xff0c;共10分&#xff09; 深度学习&#xff0c;稀疏自编码器&#xff0c;正则化&#xff0c;集成学习&#xff0c;Dropout 二&#xff0e;简答题&#xff08;每题…

ICode国际青少年编程竞赛- Python-2级训练场-列表入门

ICode国际青少年编程竞赛- Python-2级训练场-列表入门 1、 Dev.step(3)2、 Flyer.step(1) Dev.step(-2)3、 Flyer.step(1) Spaceship.step(7)4、 Flyer.step(5) Dev.turnRight() Dev.step(5) Dev.turnLeft() Dev.step(3) Dev.turnLeft() Dev.step(7) Dev.turnLeft() Dev.…

一文搞懂 ARM 64 系列: ADC

一文搞懂 ARM 64 系列: ADC1 指令语法 adc <Xd>, <Xn>, <Xm>2 指令语义 adc就是带「进位」加法,指令中的c就是英文carry。 整个指令等价于: (Xd, _) = Xn + Xm + PSTATE.C也就是将寄存器Xn,寄存器Xm,PSTATE中的「进位」标志相加,将相加的结果写入寄存器X…

初探 Google 云原生的CICD - CloudBuild

大纲 Google Cloud Build 简介 Google Cloud Build&#xff08;谷歌云构建&#xff09;是谷歌云平台&#xff08;Google Cloud Platform&#xff0c;GCP&#xff09;提供的一项服务&#xff0c;可帮助开发人员以一致和自动化的方式构建、测试和部署应用程序或构件。它为构建和…

幂等设计的8种实现方式

即无论操作执行一次还是多次&#xff0c;其效果始终如一&#xff0c;不会有差异。这就是幂等性。 什么是幂等性&#xff1f; 接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的&#xff0c;不会因为多次点击而产生了副作用。比如&#xff1a;公交车刷卡…

Linux Shell 脚本专题

本文介绍了Linux Shell环境变量和脚本使用的常用知识点。V1.0 2024年5月8日 发布于博客园目录常用环境变量一、环境变量的概念1、环境变量的含义2、环境变量的分类3、Linux环境变量二、常用的环境变量1、查看环境变量2、常用的环境变量三、设置环境量1、系统环境变量2、用户环境…

Web实操(6),基础知识学习(24~)

1.[ZJCTF 2019]NiZhuanSiWei1 &#xff08;1&#xff09;进入环境后看到一篇php代码&#xff0c;开始我简单的以为是一题常规的php伪协议&#xff0c;多次试错后发现它并没有那么简单&#xff0c;它包含了基础的文件包含&#xff0c;伪协议还有反序列化 &#xff08;2&#x…

使用docker-compose编排lnmp(dockerfile)完成wordpress

文章目录 使用docker-compose编排lnmp&#xff08;dockerfile&#xff09;完成wordpress1、服务器环境2、Docker、Docker-Compose环境安装2.1 安装Docker环境2.2 安装Docker-Compose 3、nginx3.1 新建目录&#xff0c;上传安装包3.2 编辑Dockerfile脚本3.3 准备nginx.conf配置文…

ue引擎游戏开发笔记(35)——为射击添加轨道,并显示落点

1.需求分析&#xff1a; 我们只添加了开枪特效&#xff0c;事实上并没有实际的效果产生例如弹痕&#xff0c;落点等等。所以逐步实现射击的完整化&#xff0c;先从实现落点开始。 2.操作实现&#xff1a; 1.思路&#xff1a;可以这样理解&#xff0c;每次射击的过程是一次由摄…

视频提取gif怎么制作?试试这个网站一键转换

通过把视频转换成gif动图的操作能够更加方便的在各种平台上分享和传播。相较于视频&#xff0c;gif图片具有较小的文件体积&#xff0c;gif动图能够快速的加载播放&#xff0c;不需要等待就能快速欣赏。很适合从事新媒体之类的小伙伴&#xff0c;可以用来做展示、宣传等。想要实…