深入了解 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 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.mzph.cn/diannao/8558.shtml

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

相关文章

【idea-sprongboot项目】在linux服务器上纯远程开发方式

继上一篇博客【idea-sprongboot项目】SSH连接云服务器进行远程开发-CSDN博客 目录 五、远程开发方式 2)纯远程开发方式 步骤 五、远程开发方式 2)纯远程开发方式 实现原理, 步骤 (1)首先,关闭当前正在…

springMVC入门学习

目录 1、 什么是springmvc 2、springmvc工作流程 3、 springmvc快速入门(XML版本) 4、加载自定义目录下的springmvc.xml配置文件 5、 解析器InternalResourceViewResolver 6、 映射器BeanNameUrlHandlerMapping 7、 适配器SimpleControllerHandle…

el-select 点击按钮滚动到选择框顶部

主要代码是在visibleChange 在这个 popper 里面找到 .el-select-dropdown__list let popper ref.$refs.popper const ref this.$refs.select let dom popper.querySelector(.el-select-dropdown__list) setTimeout(() > { dom.scrollIntoView() }, 800) <templat…

CSF(Cloth Simulation Filter)点云地面点滤波

CSF[Cloth Simulation Filter]点云地面点滤波 0.引言1.布料模拟2.修改布料模拟3.布料滤波4.CSF总体过程 0.引言 code 基本原理&#xff1a;原始点云被倒置过来&#xff0c;然后⼀块布从上⽅掉落到倒置的表⾯。通过分析布的节点与相应的LIDAR点之间的相互作⽤&#xff0c;可以确…

【中级软件设计师】上午题15-计算机网络

上午题15-计算机网络 1 网络设备2 协议簇3 TCP和UDP4 SMTP和POP35 ARP和RARP6 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;7 URL8 浏览器9 IP地址和子网划分10 IPv611 Windows命令12 路由器 1 网络设备 物理层设备&#xff1a;中继器、集线器&#xff0…

Mysql基础(五)外键约束

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

图像处理之SVD检测显示屏缺陷(C++)

图像处理之SVD检测显示屏缺陷&#xff08;C&#xff09; 文章目录 图像处理之SVD检测显示屏缺陷&#xff08;C&#xff09;前言一、SVD算法简介二、代码实现总结 前言 显示屏缺陷检测是机器视觉领域的一处较广泛的应用场景&#xff0c;显示屏主要有LCD和OLED&#xff0c;缺陷类…

基于java,SpringBoot和Vue的智慧校园在线考试留言讨论系统设计

摘要 基于Java, SpringBoot和Vue的智慧校园在线考试留言讨论系统是一个为现代教育需求定制的Web应用&#xff0c;它结合了最新的前后端技术来提供一个互动性强、用户友好的学习和交流平台。该系统旨在通过提供实时留言和讨论功能&#xff0c;增进学生间的互动以及师生之间的沟…

快来看 2024年ICLR杰出论文奖揭晓啦 值得关注

会议之眼 快讯 在人工智能的浪潮中&#xff0c;国际学习表征会议&#xff08;ICLR&#xff09;无疑是引领学术前沿的重要会议之一&#xff01;ICLR是深度学习领域的顶级会议之一&#xff0c;由深度学习领域的两位巨头Yoshua Bengio和Yann LeCun于2013年创办。 2024年5月6日&a…

NSSCTF中的web

目录 [第五空间 2021]WebFTP [LitCTF 2023]PHP是世界上最好的语言&#xff01;&#xff01; [SWPUCTF 2021 新生赛]PseudoProtocols [LitCTF 2023]导弹迷踪 [NISACTF 2022]easyssrf [第五空间 2021]WebFTP 1.进入页面&#xff0c;发现是登录页面&#xff0c;想到 弱口令&…

大模型微调之 在亚马逊AWS上实战LlaMA案例(六)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;六&#xff09; 通过 SageMaker Python SDK 进行微调Llama2 可以使用 SageMaker Python SDK 微调 Llama 2 模型。以下是在数据集上微调 Llama 2 7B 的示例代码&#xff1a; import os import boto3 from sagemaker.sessi…

28 JavaScript学习: 代码规范

代码规范通常包括以下几个方面: 变量和函数的命名规则空格&#xff0c;缩进&#xff0c;注释的使用规则。其他常用规范…… 变量名 在编写JavaScript代码时&#xff0c;遵守良好的变量命名规范是非常重要的&#xff0c;这可以增加代码的可读性和可维护性。以下是一些常见的…

iOS ------ 内存五大分区

1&#xff0c;内存的概念&#xff1a; 虚拟内存&#xff08;Virtual Memory&#xff09;&#xff1a;虚拟内存是操作系统提供的一种机制&#xff0c;它使得应用程序能够访问超出物理内存限制的内存空间。虚拟内存将应用程序的内存地址空间分割成固定大小的页面&#xff08;Pag…

路由策略与路由控制

1.路由控制工具 匹配工具1&#xff1a;访问控制列表 &#xff08;1&#xff09;通配符 当进行IP地址匹配的时候&#xff0c;后面会跟着32位掩码位&#xff0c;这32位称为通配符。 通配符&#xff0c;也是点分十进制格式&#xff0c;换算成二进制后&#xff0c;“0”表示“匹配…

【软考】模拟考卷错题本2024-05-07

1 项目路径 这里的图没有加载出来&#xff0c;没u哦i关系了。其实主要是的算出最长的路径中包含那些元素即可。这里是蒙圈了&#xff0c;没有考虑到还有更长的。要顾头也顾尾。 2 算法分析-贪心 该问题主要考核的是算法设计策略来达到目标的方式。主要的设计策略有&#xff1a;…

Linux变量的认识及环境变量配置详解

文章目录 1、变量的划分2、局部变量3、全局变量4、环境变量4.1、概述4.2、配置临时环境变量4.3、配置永久环境变量4.3.1、用户级配置文件1&#xff09;配置方法一&#xff1a;~/.bashrc文件2&#xff09;配置方法二&#xff1a;~/.profile文件3&#xff09;配置方法三&#xff…

CTF-reverse二维四向迷宫路径求解

二维四向迷宫是一个re中的常考点&#xff0c;说不上难&#xff0c;但也不简单&#xff0c;本篇记录了常规的二维四向迷宫解题套路以及帮助快速解题的脚本 可能你看我的教程会觉得十分繁琐&#xff0c;但实际只要你用了一次熟练之后&#xff0c;基本都是拿到迷宫就一题一分钟解决…

jmeter控制器讲解

1&#xff0c;随机顺序控制器和随机控制器的区别&#xff1a;随机顺序控制器下所有的接口都会执行&#xff0c;只是执行顺序是随机的&#xff0c;随机控制器下所有的接口中随机执行一个接口&#xff0c;其余接口不执行。

【跨境商家必读】TikTok Shop商城运营全指南

随着社交媒体和电子商务之间界限的日益模糊&#xff0c;一种全新的购物平台——TikTok商城&#xff0c;正在迅速成为全球跨境商家们关注的焦点。在这个竞争激烈的TikTok跨境电商领域中&#xff0c;了解如何有效利用TikTok Shop的各项功能&#xff0c;理解其独特的运营模式&…

Linux进程——Linux进程间切换与命令行参数

前言&#xff1a;在上一篇了解完进程状态后&#xff0c;我们简单了解了进程优先级&#xff0c;然后遗留了一点内容&#xff0c;本篇我们就来研究进程间的切换&#xff0c;来理解上篇提到的并发。如果对进程优先级还有没理解的地方可以先阅读&#xff1a; Linux进程优先级 本篇…