向量化操作简介和Pandas、Numpy示例

news2024/11/24 12:47:44

Pandas是一种流行的用于数据操作的Python库,它提供了一种称为“向量化”的强大技术可以有效地将操作应用于整个列或数据系列,从而消除了显式循环的需要。在本文中,我们将探讨什么是向量化,以及它如何简化数据分析任务。

什么是向量化?

向量化是将操作应用于整个数组或数据系列的过程,而不是逐个遍历每个元素。在Pandas中可以对整个列或Series执行操作,而无需编写显式循环。这种高效的方法利用了底层优化的库,使您的代码更快、更简洁。

向量化操作示例

1、基本算术运算

一个具有两列的DataFrame, ’ a ‘和’ B ‘,我们希望以元素方式添加这两列,并将结果存储在新列’ C '中。通过向量化,你可以在一行代码中实现这一点:

 import pandas as pd
 
 data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
 df = pd.DataFrame(data)
 # Using vectorization to add columns 'A' and 'B'
 df['C'] = df['A'] + df['B']
 print(df['C'])
 
 Output:
 0    5
 1    7
 2    9

在本例中,加法运算df[‘A’] + df[‘B’]同时应用于整个列’A’和’B’,结果存储在列’C’中。

2、apply

向量化还允许对列应用自定义函数。假设你想计算一列中每个元素的平方:

 import pandas as pd
 
 data = {'A': [1, 2, 3]}
 df = pd.DataFrame(data)
 # Define a custom function
 def square(x):
     return x ** 2
 
 # Applying the 'square' function to the 'A' column
 df['A_squared'] = df['A'].apply(square)
 print(df['A_squared'])
 
 Output:
 0    1
 1    4
 2    9

使用.apply()将平方函数应用于整个’A’列。不需要显式循环。

3、条件操作

也将矢量化用于条件操作,比如基于列a中的条件创建一个新的列D:

 import pandas as pd
 
 data = {'A': [1, 2, 3]}
 df = pd.DataFrame(data)
 
 # Creating a new column 'D' based on a condition in column 'A'
 df['D'] = df['A'].apply(lambda x: 'Even' if x % 2 == 0 else 'Odd')
 
 print(df)
 
 Output:
    A     D
 0  1   Odd
 1  2  Even
 2  3   Odd

使用lambda函数来检查’ a ‘中的每个元素是偶数还是奇数,并将结果分配给’ D '列。

向量化的好处

在Pandas中向量化提供了几个好处:

  • 效率:操作针对性能进行了优化,并且比传统的基于循环的操作快得多,特别是在大型数据集上。
  • 清晰度:与显式循环的代码相比,代码通常更简洁,更容易阅读。
  • 易用性:您可以使用一行代码将操作应用于整个行或列,降低了脚本的复杂性。
  • 兼容性:Pandas与其他数据科学库(如NumPy和scikit-learn)无缝集成,可以在数据分析和机器学习项目中有效地使用向量化数据。

向量化提高代码的速度

向量化是一种强大的编程技术,可以加快代码的执行速度。这种方法利用底层优化的硬件指令和库,使计算更快、更高效。让我们以Python和NumPy为例,探索向量化如何加快代码的速度。

传统的基于循环的处理

在许多编程场景中,可能需要对数据元素集合执行相同的操作,例如逐个添加两个数组或对数组的每个元素应用数学函数。一般都会使用循环一次迭代一个元素并执行操作。

下面是一个没有向量化的Python示例:

 list1 = [1, 2, 3, 4, 5]
 list2 = [6, 7, 8, 9, 10]
 result = []
 
 for i in range(len(list1)):
     result.append(list1[i] + list2[i])
 print(result)
 
 Output:
 [7, 9, 11, 13, 15]

虽然此代码可以工作,但它在循环中单独处理每个元素,这对于大型数据集来说可能很慢。

使用NumPy进行向量化操作

NumPy是一个流行的Python库,提供对向量化操作的支持。它利用了优化的C和Fortran库,使其在数值计算方面比纯Python循环快得多。

下面是使用NumPy的相同加法操作:

 array1 = np.array([1, 2, 3, 4, 5])
 array2 = np.array([6, 7, 8, 9, 10])
 result = array1 + array2
 print(result)
 
 Output:
 [ 7  9 11 13 15]

NumPy可以一次对整个数组执行操作,并且更有效地处理底层细节。

效率比较

比较一下使用NumPy和Python中传统的基于循环的方法执行元素加法所花费的时间。我们将使用timeit模块来度量这两个方法的执行时间。下面是比较的代码:

 import numpy as np
 import timeit
 
 # Create two NumPy arrays and two lists for the comparison
 array1 = np.random.randint(1, 100, size=1000000)
 array2 = np.random.randint(1, 100, size=1000000)
 list1 = list(array1)
 list2 = list(array2)
 
 # Vectorized processing with NumPy
 def numpy_vectorized():
     result = array1 + array2
 
 # Traditional loop-based processing
 def loop_based():
     result = []
     for i in range(len(list1)):
         result.append(list1[i] + list2[i])
 
 # Measure execution time for NumPy vectorized approach
 numpy_time = timeit.timeit(numpy_vectorized, number=100)
 
 # Measure execution time for traditional loop-based approach
 loop_time = timeit.timeit(loop_based, number=100)
 
 print(f"NumPy Vectorized Approach: {numpy_time:.5f} seconds")
 print(f"Traditional Loop-Based Approach: {loop_time:.5f} seconds")
 
 
 Output:
 NumPy Vectorized Approach: 0.30273 seconds
 Traditional Loop-Based Approach: 17.91837 seconds

可以看到NumPy向量化方法对于大数据集的速度要快得多,因为它的矢量化操作是经过优化的。

向量化加速代码的原理

向量化为加快代码速度提供了几个优势:

减少循环开销:在传统循环中,存在与管理循环索引和检查循环条件相关的开销。通过向量化,可以消除这些开销,因为这些操作应用于整个数组。

优化的低级指令:像NumPy这样的库使用优化的低级指令(例如,现代cpu上的SIMD指令)来对数组执行操作,充分利用硬件功能。这可以显著提高速度。

并行性:一些向量化操作可以并行化,这意味着现代处理器可以同时执行多个操作。这种并行性进一步加快了计算速度。

总结

Pandas和NumPy等库中的向量化是一种强大的技术,可以提高Python中数据操作任务的效率。可以以高度优化的方式对整个列或数据集合执行操作,从而生成更快、更简洁的代码。所以无论是在处理基本算术、自定义函数还是条件操作,利用向量化都可以极大地改进数据分析工作流。

https://avoid.overfit.cn/post/ae2f68c9b2a548b59629755a05bbcebe

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

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

相关文章

appium---如何判断原生页面和H5页面

目前app中存在越来越多的H5页面了,对于一些做app自动化的测试来说,要求也越来越高,自动化不仅仅要支持原生页面,也要可以H5中进行操作自动化, webview是什么 webview是属于android中的一个控件,也相当于一…

GFD233A103 3BHE022294R0103 串行和并行通信的区别

GFD233A103 3BHE022294R0103 串行和并行通信的区别 串行通信和并行通信的关键区别在于,在串行通信中,一条通信链路用于将数据从一端传输到另一端。与并行通信相反,使用多个并行链路同时传输每位数据。 由于只有一条通信链路,串行…

到底什么是5G-R?

近日,工信部向中国国家铁路集团有限公司(以下简称“国铁集团”)批复5G-R试验频率的消息,引起了行业内的广泛关注。 究竟什么是5G-R?为什么工信部会在此时批复5G-R的试验频率? 今天,小枣君就通过…

win10取消ie浏览器自动跳转edge浏览器

建议大家看完整篇文章再作操作 随着windows10 日渐更新,各种不同的操作,规避IE浏览器跳转Edge浏览器的问题 算了,找了台云机装的server 有自带的IE 1.(失败)思路 协助Edge浏览器 管理员身份打开 PowerShell 一般e…

一个有趣的观点:用To C的思路来做To B

大数据产业创新服务媒体 ——聚焦数据 改变商业 在传统商业模式中,B端市场和C端市场被视为截然不同的两个领域,各自有各自的战略和运营模式。但随着技术的迅速发展和市场环境的变化,这两个领域之间的界限正在逐渐模糊。 尽管B端软件的目标客…

外卖跑腿系统的关键功能和技术要点

1. 用户注册和登录 首先,用户需要能够注册新账户并登录。以下是使用Python和Django框架的代码示例,展示如何创建用户注册和登录功能。 # Django视图代码 from django.contrib.auth import login, authenticate from django.contrib.auth.forms import…

需求评审如何一次过?

需求评审是产品经理一项绕不过去的工作,但对于产品新人来说,可能不是一件简单的事情,方案准备的是否充分,能否经受住项目其他成员的灵魂拷问,都极大的考验着产品经理的技能和抗压能力,今天就来说说如何做好…

kettle应用-数据库表插入/更新

本文介绍从pg数据库中抽取数据,插入/更新到另一个表中 数据流转逻辑设计 【表输入】--》【增加序列】--》【插入/更新】 一、表输入:关联多表查询获取数据 “核心对象”区域--“输入”中,拖入“表输入” 二、增加序列:生成序列…

我的创作日

目录 机缘 收获 日常 成就 憧憬 机缘 《AR助教奇迹人总结》这是最开始大佬叫我写的文章,大佬说写完发到CSDN,刚开始我还纳闷什么叫CSDN呢,无意间我看到我的码龄竟然是两年,哈哈可能是无意间自己注册的吧,连我自己…

linux内存、cpu、进程、端口、硬盘管理

这里讲解一下linux内存、cpu、进程、端口、硬盘管理命令操作,更多linux常用命令见:一些经常使用的linux命令 一、内存、cup 管理 top 命令 1、top 命令的第一行 top - 10:11:23 up 12:10, 2 users, load average: 0.00, 0.02, 0.05 依次对应: 系统当前时间 10:11:…

Linux定时任务 crond

crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程;这是一个后台程序。 crontab是一个工具,用用编辑crond的配置文件。 **硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 …

vmware ubuntu 虚拟机 网卡图片消失处理办法

如图,这个图标消失处理办法: 输入如下指令:sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start

GEE错误——利用selector选择指定的属性列表进行表格的导出(相关错误解析)

本文主要是利用目的是利用selector选择指定的属性列表进行表格的导出,这里的目的是我们就用这个表格选取指定的属性列表即可。 相关错误: 我正在尝试获取每个点的平均土壤值。代码运行良好,但我得到一个空白列。我可能必须添加 .set 或 .get 或其他东西,我尝试过但没有运气…

服务器中了mkp勒索病毒怎么办?mkp勒索病毒特点,解密数据恢复

Mkp勒索病毒是最近比较流行的勒索病毒,从10月份国庆节假期结束以来,云天数据恢复中心陆续收到很多企业的求助,企业的服务器被mkp勒索病毒攻击,导致企业的众多软件无法正常使用,像用友与金蝶软件都有遭受过mkp勒索病毒的…

Redis 第二章:通用命令

Redis 提供了 5 种数据结构,理解每种数据结构的特点对于 Redis 开发运维⾮常重要,同时掌握每种数据结构的常⻅命令,会在使⽤ Redis 的时候做到游刃有余。 目录 2.1 预备知识 2.1.1 基本全局命令 2.1.2 数据结构和内部编码 2.1.3 单线程架…

计算小于或等于n的非负整数区间包含的1的数量

在许多编程面试中,我们可能会碰到各种不同的问题,要求我们分析给定的数据或条件,以得出特定的结果。其中一个常见的问题是,给定一个整数n,要求计算出小于或等于n的非负整数区间包含的1的数量。这个问题可以通过直接编程…

springboot 导出word模板

一、安装依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version></dependency>二、定义工具类 package com.example.springbootmp.utils;import com.deepoove.poi.XWP…

实现一个todoList可直接操作数据(上移、下移、置顶、置底)

演示 HTML部分 <!DOCTYPE html> <html> <head><title>表格示例</title> </head> <body><table border"1"><thead><tr><th>更新时间</th><th>操作</th></tr></thead&…

nginx重启错误:nginx: [alert] kill(1630, 1) failed (3: No such process)

目录 一、问题&#xff1a; 二、原因&#xff1a; 三、解决方法&#xff1a; 一、问题&#xff1a; nginx: [alert] kill(1630, 1) failed (3: No such process) 二、原因&#xff1a; nginx&#xff1a; [警报] kill&#xff08;1630&#xff0c; 1&#xff09; 失败 &…

同源多页面实时通信之BroadcastChannel实现及简单封装

目录 背景介绍及API使用是什么对象实例化发送消息监听消息错误处理关闭通道 项目中简单封装channel.js文件&#xff0c;引入到使用的页面中发送端send.html监听端运行测试一下吧 浏览器兼容程度总结 背景 日常开发做项目时&#xff0c;如果采用非Vue脚手架时&#xff0c;肯定会…