《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.mzph.cn/news/657382.shtml

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

相关文章

vxe-table表格合并行和虚拟滚动冲突

项目一直用的vxe-table 2.0版本,支持表格的虚拟滚动,最近要做表格合并行功能,虚拟滚动便失效了,强行虚拟滚动,合并行会有错行现象。 vxe-table2.0给出的解释是:合并行不能和虚拟滚动一起使用。 目前找到两种…

华为VRP系统简介

因为现在国内主流是华为、华三、锐捷的设备趋势,然后考的证书也是相关的,对于华为设备的一个了解也是需要的。 一、VRP概述 华为的VRP(通用路由平台)是华为公司数据通信产品的通用操作系统平台,作为华为公司从低端到核心的全系列路由器、以太…

个人建站前端篇(一)项目准备初始化以及远程仓库连接

云风的知识库 云风网前端重构,采用vue3.0vite antd框架,实现前后端分离,实现网站的SEO优化,实现网站的性能优化 vite创建vue项目以及前期准备 Vite 需要 Node.js 版本 18,20。然而,有些模板需要依赖更高…

java生成dll,并利用c语言使用libcurl调用http接口

本文可能需要使用的环境和工具: c/ c和GCC编译器 (Windows) Cygwin或MinGW 本文运行环境为windows10,使用MinGW-W64-builds-4.2.0 curl-8.5.0 libcurl 可以在官网 http://curl.haxx.se/ 获得。 配置MinGW 将mingw.rar解压到D:,修改系统…

Java面试题之 IO(四)

Java面试题之 IO(四) 文章目录 Java面试题之 IO(四)随机访问流 文章来自Java Guide 用于学习如有侵权,立即删除 随机访问流 这里要介绍的随机访问流指的是支持随意跳转到文件的任意位置进行读写的 RandomAccessFile 。…

防火墙综合拓扑(NAT、双机热备)

实验需求 拓扑 实验注意点: 先配置双机热备,再来配置安全策略和NAT两台双机热备的防火墙的接口号必须一致如果其中一台防火墙有过配置,最好清空或重启,不然配置会同步失败两台防火墙同步完成后,可以直接在主状态防火墙…

浅谈WPF之UniformGrid和ItemsControl

在日常开发中,有些布局非常具有规律性,比如相同的列宽,行高,均匀的排列等,为了简化开发,WPF提供了UniformGrid布局和ItemsControl容器,本文以一个简单的小例子,简述,如何…

TSINGSEE青犀智能分析网关V4—让加油站迈入AI智能检测时代

一、背景与需求 中国目前建设加油站超过10万个,作为高危场所对于烟火,危险区域管控、消防器材等管理要求严格,稍有不慎即酿成大祸。由于春节临近,加油站各类人员进出频繁,安全意识较低,依靠普通监控人力的…

java常量和kotlin常量

在java中使用final声明常量在kotlin中使用const val声明常量 常量在编译为字节码后会直接把调用常量的地方直接替换为常量值,示例如下: public class ConstDemo {public static final String NAME "Even";private static final int ID 100…

海外云手机开辟企业跨境电商新道路

近几年,海外云手机为跨境电商、海外媒体引流、游戏行业等互联网领域注入了蓬勃活力。对于国内跨境电商而言,在亚马逊及其他平台上,短视频引流和社交电商营销成为最为有效的流量来源。如何通过海外云手机的助力,在新兴社交平台为企…

python二维高斯热力图绘制简单的思路代码

import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter import cv2# 生成一个示例图像 image_size 100 image np.zeros((image_size, image_size))# 在图像中心创建一个高亮区域 center_x, center_y image_size // 2, image_size …

【遥感专题系列】遥感影像信息提取之——人工目视解译

​遥感影像通过亮度值或像元值的高低差异(反映地物的光谱信息)及空间变化(反映地物的空间信息)来表示不同地物的差异,这是区分不同影像地物的物理基础。 ​人工解译是目前国内使用最多的一种影像提取方法,如…

力扣hot100 单词搜索 深度优先搜索 特殊字符判重

Problem: 79. 单词搜索 Code class Solution{int n, m;char[][] b;String word;int[] dx { 1, 0, -1, 0 };int[] dy { 0, 1, 0, -1 };public boolean exist(char[][] board, String word){b board;this.word word;n b.length;m b[0].length; // 以所有点作为起点来进行…

生词本----Python实例练习

题目描述 背单词是英语学习中最基础的一环,不少学生在背诵单词的过程中会整理自己的生词本,以不断拓展自己的词汇量。本实例要求编写生词本程序,该程序需具备以下功能。 (1)查看生词列表功能:输出生词本中…

系统分析师-22年-下午题目

系统分析师-22年-下午题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答,二、三、四、五题中任选其中两题作答 试题一 (25分) 说明 某软件公司拟开发一套博客系统,要求能够向用户提供一个便捷发布自已心得,及时有效的…

腾讯云SDK并发调用优化方案

目录 一、概述 二、 网关的使用 2.1 核心代码 三、腾讯云SDK依赖包的改造 一、概述 此网关主要用于协调腾讯云SDK调用的QPS消耗,使得多个腾讯云用户资源能得到最大限度的利用。避免直接使用腾讯云SDK 时,在较大并发情况下导致接口调用异常。网关的工…

Yolo v8 入门学习之采用 coco128 数据集进行图片检测测试

示例入门代码 from ultralytics import YOLO import cv2 import matplotlib.pyplot as plt import matplotlib.image as mpimgdef test():# Create a new YOLO model from scratchmodel YOLO(yolov8n.yaml)# Load a pretrained YOLO model (recommended for training)model …

Redis -- 开篇热身,常用的全局命令

目录 Redis重要文件 启动停止脚本 配置文件 持久化文件存储目录 核心命令 set get 全局命令 keys exists del expire ttl 过期策略是如何实现的 定时器 type 小结 Redis重要文件 启动停止脚本 /usr/bin/redis-benchmark : 用于对Redis做性能基准…

SpringCloud_学习笔记_1

SpringCloud01 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…

opencv学习 特征提取

内容来源于《opencv4应用开发入门、进阶与工程化实践》 图像金字塔 略 拉普拉斯金字塔 对输入图像进行reduce操作会生成不同分辨率的图像,对这些图像进行expand操作,然后使用reduce减去expand之后的结果,就会得到拉普拉斯金字塔图像。 …