《Numpy 简易速速上手小册》第5章:Numpy高效计算与广播(2024 最新版)

在这里插入图片描述

文章目录

  • 5.1 向量化计算
    • 5.1.1 基础知识
    • 5.1.2 完整案例:股票数据分析
    • 5.1.3 拓展案例 1:多维数组运算
    • 5.1.4 拓展案例 2:复杂函数的向量化应用
  • 5.2 广播机制
    • 5.2.1 基础知识
    • 5.2.2 完整案例:二维数据与一维数据运算
    • 5.2.3 拓展案例 1:标准化二维数据
    • 5.2.4 拓展案例 2:多维度广播
  • 5.3 性能优化技巧
    • 5.3.1 基础知识
    • 5.3.2 完整案例:大型数据集处理
    • 5.3.3 拓展案例 1:就地操作优化
    • 5.3.4 拓展案例 2:利用内置函数处理多维数据

5.1 向量化计算

5.1.1 基础知识

向量化计算是 Numpy 的核心特性之一,它允许我们对整个数组执行操作,而不是单独对数组的每个元素进行循环处理。这种操作不仅代码更加简洁易读,还能大幅提升计算效率。

  • 避免循环:通过直接对数组进行操作,避免了 Python 中昂贵的循环。
  • 并行处理:向量化操作允许 CPU 并行处理数据,提升了性能。
  • 广义应用:适用于加减乘除等基本运算,也适用于更复杂的数学函数。

5.1.2 完整案例:股票数据分析

假设你正在分析股市数据,需要计算股票的日收益率。

import numpy as np# 假设这是连续五天的股票价格
stock_prices = np.array([100, 102, 105, 110, 108])# 计算日收益率
daily_returns = (stock_prices[1:] - stock_prices[:-1]) / stock_prices[:-1]print("Daily Returns:", daily_returns)

在这个案例中,我们使用向量化操作一步计算了股票的日收益率,避免了循环遍历每个股价的需要。

5.1.3 拓展案例 1:多维数组运算

向量化不仅适用于一维数组,也同样适用于多维数组。

# 创建一个 3x3 的二维数组
matrix = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 计算每个元素的平方
squared_matrix = matrix ** 2print("Squared Matrix:\n", squared_matrix)

在这个案例中,我们对一个二维数组的每个元素进行了平方运算。

5.1.4 拓展案例 2:复杂函数的向量化应用

向量化计算也可以用于更复杂的数学函数和自定义操作。

# 定义一个自定义函数
def custom_operation(x):return x**2 - 2*x + 1# 创建一个数组
data = np.array([1, 2, 3, 4, 5])# 向量化地应用自定义函数
result = custom_operation(data)print("Result of Custom Operation:", result)

在这个案例中,我们定义了一个自定义函数并将其向量化地应用到一个数组上,展示了向量化对于复杂操作的有效性。

向量化计算是 Numpy 的强大之处,它不仅提升了代码的执行效率,还使代码更加简洁和易于理解。掌握向量化是成为高效数据科学家的关键一步。

在这里插入图片描述


5.2 广播机制

5.2.1 基础知识

广播机制是 Numpy 中的一个强大特性,它允许对不同形状的数组进行数学运算。这种机制遵循特定的规则来“广播”较小数组的形状以匹配较大数组的形状。

  • 广播规则
    1. 如果两个数组维度数不同,形状会从较小数组的末端开始补齐。
    2. 在任何一个维度上,数组的大小要么相同,要么其中一个为 1,要么其中一个不存在。
    3. 当数组的大小在某个维度上为 1 时,这个维度上的数值会沿此维度复制扩展。

广播机制使得数组运算在不同形状的数组间变得可能,并且在内存中无需实际复制数据。

5.2.2 完整案例:二维数据与一维数据运算

假设你在处理一个二维数据集,并想将其每一行都加上一个一维数组。

import numpy as np# 一个 3x3 的二维数组
matrix = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 一个一维数组
vector = np.array([1, 0, -1])# 使用广播机制进行运算
result = matrix + vectorprint("Result of Broadcasting:\n", result)

在这个案例中,一维数组 vector 被广播到与二维数组 matrix 相同的形状,并执行了逐元素相加的操作。

5.2.3 拓展案例 1:标准化二维数据

广播机制可以用于更复杂的数据处理任务,例如标准化一个二维数组的每一列。

# 生成一个 5x3 的随机数组
data = np.random.random((5, 3))# 计算每列的均值和标准差
mean = data.mean(axis=0)
std = data.std(axis=0)# 标准化数据
normalized_data = (data - mean) / stdprint("Normalized Data:\n", normalized_data)

在这个案例中,我们计算了数组每列的均值和标准差,并用广播机制将每列数据标准化。

5.2.4 拓展案例 2:多维度广播

广播机制同样适用于更高维度的数组运算。

# 创建一个 4x1x3 的三维数组
array_3d = np.arange(12).reshape((4, 1, 3))# 创建一个 1x3 的一维数组
array_1d = np.array([1, 2, 3])# 广播运算
result_3d = array_3d + array_1dprint("Result of Broadcasting a 3D and 1D array:\n", result_3d)

在这个案例中,一维数组在与三维数组相加时被广播到匹配的形状,然后进行逐元素相加。

广播机制极大地增强了 Numpy 数组的灵活性,使得我们可以轻松地对形状不同的数组执行复杂的数学运算。掌握广播是提高数据处理效率和性能的关键。

在这里插入图片描述


5.3 性能优化技巧

5.3.1 基础知识

在处理大型数据集或执行复杂数据操作时,性能成为一个关键因素。Numpy 提供了多种优化技巧,帮助提高代码的运行效率。

  • 预分配内存:提前分配好所需的数组空间,避免在数据处理过程中不断扩展数组,这样可以减少内存分配和复制的开销。
  • 避免不必要的复制:尽量使用 Numpy 的就地操作(in-place operations)来避免不必要的内存复制。
  • 使用内置函数:利用 Numpy 的内置函数,这些函数底层采用 C 或 Fortran 编写,比 Python 循环快得多。
  • 向量化操作:尽量使用向量化操作代替循环,这是提高 Numpy 性能的最重要手段之一。

5.3.2 完整案例:大型数据集处理

假设你在处理一个非常大的数据集,需要计算所有元素的总和。

import numpy as np# 创建一个非常大的数组
large_array = np.random.rand(1000000)# 预分配内存
result = 0.0# 向量化求和
result = np.sum(large_array)print("Sum of Large Array:", result)

在这个案例中,我们使用了 np.sum() 来向量化地对一个非常大的数组求和,这比 Python 内置的 sum() 函数快得多。

5.3.3 拓展案例 1:就地操作优化

在进行数组操作时,就地修改数组可以节约大量内存。

# 创建一个大型数组
large_array = np.random.rand(1000000)# 就地操作修改数组
large_array *= 2.0  # 直接在原数组上进行操作print("Modified Large Array:", large_array)

在这个案例中,我们直接在原数组上进行了操作,而不是创建一个新的数组,这样可以显著减少内存的使用。

5.3.4 拓展案例 2:利用内置函数处理多维数据

当处理多维数据时,使用 Numpy 的内置函数可以显著提高性能。

# 创建一个大型的多维数组
large_multi_array = np.random.rand(1000, 1000)# 使用内置函数计算每列的平均值
column_means = np.mean(large_multi_array, axis=0)print("Column Means:", column_means)

在这个案例中,我们使用了 np.mean() 来计算大型多维数组每列的平均值,这比手动编写循环快得多,并且代码也更简洁。

掌握这些性能优化技巧,你将能够更有效地处理大型数据集,并且提高数据处理的效率。这些技巧是每个使用 Numpy 进行数据分析的人都应该掌握的。

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

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

相关文章

Electron桌面应用实战:Element UI 导航栏橙色轮廓之谜与Bootstrap样式冲突解决方案

目录 引言 问题现象及排查过程 描述问题 深入探索 查明原因 解决方案与策略探讨 重写样式 禁用 Bootstrap 样式片段 深度定制 Element UI 组件 隔离样式作用域 结语 引言 在基于 Electron 开发桌面应用的过程中,我们可能时常遇到各种意想不到的问题…

JDK Locale的妙用:探索多语言和地区设置的强大功能

文章目录 前言应用场景国际化(Internationalization)格式化(Formatting)日期格式化数字格式化金额格式化百分比形式格式化 获取Locale信息 前言 JDK(Java Development Kit)的Locale类用于表示特定的地理、…

【C深度解剖】计算机数据下载和删除原理

简介:本系列博客为C深度解剖系列内容,以某个点为中心进行相关详细拓展 适宜人群:已大体了解C语法同学 作者留言:本博客相关内容如需转载请注明出处,本人学疏才浅,难免存在些许错误,望留言指正 作…

Spring Boot + security + jwt 测试安全策略

一、测试概述 主要目的是测试security的用法。因测试搭建mysql和redis比较麻烦,所以我这里将自定义的jwt和用户信息缓存到程序的内存中。 本人测试的项目比较混乱,Spring Boot父类只标出有用的依赖。其子类用的版本为jdk11。后续会继续深入oauth2&#x…

N65总账凭证管理凭证查询(sql)

--核算账簿 select code , name , pk_setofbook from org_setofbook where ( pk_setofbook in ( select pk_setofbook from org_accountingbook where 1 1 and ( pk_group N0001A11000000000037X ) and ( accountenablestate 2 ) ) ) order by code;--核算账簿 select code …

Python(19)Excel表格操作Ⅰ

目录 导包 读取EXCEL文件 1、获取worksheet名称 2、设定当前工作表 3、输出目标单元格数据 4、工作表.rows(行) 5、工作表.columns(列) 小结 导包 要想使用 python 操作 Excel 文件,应当导入 openpyxl 包。在…

【习题】使用DevEco Studio高效开发

单选题 1. 用哪一种装饰器修饰的组件可作为页面入口组件?B A. Component B. Entry C. Preview D. Builder 回答正确 2. ArkTS Stage模型支持API Version 9,关于其工程目录结构说法正确的是?C A. oh-package.json5用于存放应用级配置信…

20240130在ubuntu20.04.6下给GTX1080安装最新的驱动和CUDA

20240130在ubuntu20.04.6下给GTX1080安装最新的驱动和CUDA 2024/1/30 12:27 缘起,为了在ubuntu20.4.6下使用whisper,以前用的是GTX1080M,装了535的驱动。 现在在PDD拼多多上了入手了一张二手的GTX1080,需要将安装最新的545的驱动程…

读书人必须知道的9个搜书引擎

各位小伙伴大家好,众所周知,现在找资源的难度要比以前高的多,各种网站封的封删的删,但大家对书籍资源的需求却越来越大。那今天我镜像哥就决定整一期电子书资源狠活儿。 这些资源都是我辛苦收集,并逐一验证筛选出来的的…

如何安装配置HFS并实现无公网ip远程访问本地电脑共享文件

文章目录 前言1.下载安装cpolar1.1 设置HFS访客1.2 虚拟文件系统 2. 使用cpolar建立一条内网穿透数据隧道2.1 保留隧道2.2 隧道名称2.3 成功使用cpolar创建二级子域名访问本地hfs 总结 前言 在大厂的云存储产品热度下降后,私人的NAS热度快速上升,其中最…

Fisher线性判别分析

Fisher线性判别分析 原理 LDA(Linear Discriminant Analysis)是一种经典的线性判别方法,又称Fisher判别分析。该方法思想比较简单:给定训练集样例,设法将样例投影到一维的直线上,使得同类样例的投影点尽可能接…

Mybatis-Plus扩展

7 MybatisX插件[扩展] 7.1 MybatisX插件介绍 MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。 安装方法:打开 IDEA,进入 File -> Settings -> Plugins -> Browse Repositories,输入 mybatisx 搜索并安装。 功…