查看全课大纲(第 31 / 101 节)
- 1.数据分析基本概念
- 2.学习数据分析的一般路线
- 3.数据分析的流程
- 4.数据类型
- 5.环境部署(1)
- 6.环境部署(2)
- 7.课程介绍
- 8.TXT文件操作
- 9.JSON文件操作
- 10.CSV文件操作
- 11.Excel文件操作
- 12.数据库及SQL常用语法
- 13.数据库基本操作
- 14.数据库多表连接
- 15.实战:欧洲职业足球数据库分析
- 16.爬虫简介
- 17.URL管理模块
- 18.网页下载模块
- 19.网页解析模块(1)
- 20.网页解析模块(2)
- 21.Scrapy简介
- 22.Scrapy使用步骤(1)
- 23.Scrapy使用步骤(2)
- 24.Scrapy使用步骤(3)
- 25.Scrapy使用步骤(4)
- 26.实战:获取国内城市空气质量指数数据
- 27.NumPy和SciPy介绍
- 28.多维数组
- 29.多维数组操作
- 30.NumPy的常用方法
- 31.向量化介绍
- 32.向量化及通用函数
- 33.实战:2016美国大选分析
- 34.数据结构-Series
- 35.数据结构-DataFrame
- 36.数据结构-Index
- 37.Series的索引操作
- 38.DataFrame的索引操作
- 39.索引操作总结
- 40.运算与对齐
- 41.函数应用操作(1) -- map
- 42.函数应用操作 (2) -- apply applymap
- 43.文件读写操作
- 44.排序操作
- 45.数据清洗--处理缺失数据
- 46.数据清洗--处理重复数据
- 47.数据清洗--替换数据
- 48.常用统计方法(1) -- describe quantile
- 49.常用统计方法(2) -- sum mean median count
- 50.常用统计方法(3) -- max min idxmax idxmin
- 51.常用统计方法(4) -- mad var std cumsum
- 52.实战:全球食品数据分析
- 53.层级索引
- 54.分组与聚合介绍
- 55.分组操作(1) -- GroupBy对象及常用聚合操作
- 56.分组操作(2) -- 自定义分组及聚合操作
- 57.透视表介绍
- 58.透视表操作
- 59.数据规整(1) -- 数据合并concat
- 60.数据规整(2) -- 数据连接merge
- 61.数据重构(3) -- 数据重构stack unstack
- 62.实战:互联网电影资料库分析
- 63.探索性数据分析EDA介绍
- 64.EDA的目的
- 65.EDA常用工具
- 66.Matplotlib绘图基本介绍
- 67.Matplotlib画布
- 68.散点图和柱状图的绘制
- 69.直方图的绘制
- 70.矩阵绘图
- 71.子图的使用
- 72.Matplotlib颜色、标记、线型
- 73.Matplotlib坐标刻度、标签、图例、标题
- 74.Seaborn介绍
- 75.数据集分布可视化(1) -- 单变量分布、双变量分布
- 76.数据集分布可视化(2) -- 变量关系可视化
- 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
- 78.交互式数据可视化工具Bokeh介绍
- 79.Bokeh绘制散点图、柱状图、盒子图、弦图
- 80.Bokeh绘制常用图形元素
- 81.3D绘图 -- mplot3d
- 82.3D曲线可视化
- 83.3D散点图可视化
- 84.3D柱状图可视化
- 85.Pandas绘图
- 86.实战:Lending Club借贷数据探索性分析及可视化
- 87.机器学习介绍及应用场景
- 88.机器学习建模介绍 (1) -- 分类
- 89.机器学习建模介绍 (2) -- 回归
- 90.机器学习建模介绍 (3) -- 聚类
- 91.机器学习分类
- 92.机器学习工具scikit-learn
- 93.使用scikit-learn的流程
- 94.数据集准备及划分
- 95.模型选择
- 96.数据预处理及特征工程
- 97.过拟合与欠拟合
- 98.模型调参介绍
- 99.模型调参方法
- 100.模型测试及评价
- 101.实战:通过移动设备行为数据预测性别和年龄
向量化介绍
约 8 分钟
向量化与广播操作
小象实战讲义 · Python数据分析实战
在上一节我们学习了NumPy数组的基本操作。但NumPy真正的威力在于其高效的向量化计算能力。本节将深入讲解向量化(Vectorization)和广播(Broadcasting)这两个核心概念,它们是NumPy高效处理数据的基础,也是后续进行数据分析时必备的思维方式。
💡 核心导读
- 向量化:一种避免显式循环,对整个数组进行一次性操作的高效编程范式。
- 向量化的优势:代码更简洁、执行速度更快(底层由C语言实现)。
- 广播机制:NumPy处理不同形状数组间运算的规则,能够自动扩展小数组以匹配大数组的形状。
- 广播的应用场景:标量与数组运算、不同维度数组间的运算。
什么是向量化(Vectorization)
向量化,英文为Vectorization,是NumPy中一种核心的操作思想。它的目标是通过避免在Python层面编写显式的for循环,来获得执行速度更快、代码更紧凑的程序。
基本思路:将操作“一次性”应用在整个数组(或其它复杂对象)上,而不是通过循环逐个处理数组中的元素。
我们通过一个简单的例子来理解这种思维方式的转变。假设有两个列表(或数组)A = [1, 2, 3, 4]和B = [6, 7, 8, 9],我们需要计算它们对应元素的乘积。
传统Python循环方式:
A = [1, 2, 3, 4]
B = [6, 7, 8, 9]
result = []
for a, b in zip(A, B):
result.append(a * b)
print(result)[6, 14, 24, 36]NumPy向量化方式:
import numpy as np
A = np.array([1, 2, 3, 4])
B = np.array([6, 7, 8, 9])
result = A * B # 一次性对整个数组进行乘法运算
print(result)[ 6 14 24 36]可以看到,向量化操作只用了一行代码 A * B 就完成了任务。在向量化的思维方式中,我们把 A 和 B 各自看作一个整体(向量),操作是在两个整体之间进行的,而不是分别处理它们内部的每个元素。
这种方式的优势非常明显:
- 代码简洁:逻辑清晰,更易于阅读和维护。
- 性能卓越:NumPy的向量化操作底层由高度优化的C代码实现,其执行速度远快于纯Python的循环。对于大规模数据,这种性能差异是数量级的。
因此,在学习数据分析时,有意识地培养自己的“向量化思维”至关重要。
广播机制(Broadcasting)
向量化操作通常要求数组形状完全一致。那么,当我们需要对不同形状的数组进行运算时,该怎么办呢?NumPy通过广播机制来解决这个问题。
广播的核心规则是:将形状较小的数组(或标量)“广播”到与形状较大的数组具有兼容的维度,以便进行元素级的运算。
标量与数组的广播
这是最简单的广播形式。一个标量(单个数值)可以与任意形状的数组进行运算。
import numpy as np
arr = np.arange(3) # 数组形状为 (3,),值为 [0, 1, 2]
result = arr + 5 # 标量5被广播成形状(3,)的数组[5, 5, 5]
print("arr:", arr)
print("arr + 5:", result)arr: [0 1 2]
arr + 5: [5 6 7]运算过程可以理解为:标量5被复制成了一个与arr形状相同的临时数组[5, 5, 5],然后执行元素相加[0+5, 1+5, 2+5]。
一维数组与二维数组的广播
当数组维度不同时,广播会尝试从它们的形状元组末尾开始对齐,并满足以下两个条件之一:
- 维度大小相等。
- 其中一个维度大小为1。
import numpy as np
# 示例1:二维数组 + 一维行数组
arr_2d = np.ones((3, 3)) # 形状 (3, 3)
arr_1d_row = np.arange(3) # 形状 (3,),可视为(1, 3)
result1 = arr_2d + arr_1d_row
print("3x3全1数组 + [0,1,2]:")
print(result1)
# 示例2:二维数组 + 一维列数组
arr_1d_col = np.arange(3).reshape(3, 1) # 形状 (3, 1)
result2 = arr_2d + arr_1d_col
print("\n3x3全1数组 + [[0],[1],[2]]:")
print(result2)3x3全1数组 + [0,1,2]:
[[1. 2. 3.]
[1. 2. 3.]
[1. 2. 3.]]
3x3全1数组 + [[0],[1],[2]]:
[[1. 1. 1.]
[2. 2. 2.]
[3. 3. 3.]]解释:
arr_2d形状为(3,3),arr_1d_row形状为(3,)。对齐时,arr_1d_row被视为(1,3)。由于在第一个维度上大小为1,它被广播(复制)成(3,3),然后相加。arr_1d_col形状为(3,1)。在第二个维度上大小为1,它被广播(复制)成(3,3),然后相加。
综合示例:两个一维数组的广播
当两个数组形状不完全相同但都包含大小为1的维度时,它们可以相互广播到一个共同的形状。
import numpy as np
# 创建一个3行1列的数组和一个1行3列的数组
col_vector = np.arange(3).reshape(3, 1) # 形状 (3, 1),值 [[0],[1],[2]]
row_vector = np.arange(3).reshape(1, 3) # 形状 (1, 3),值 [[0, 1, 2]]
result = col_vector + row_vector
print("列向量 (3,1):")
print(col_vector)
print("\n行向量 (1,3):")
print(row_vector)
print("\n广播相加结果 (3,3):")
print(result)列向量 (3,1):
[[0]
[1]
[2]]
行向量 (1,3):
[[0 1 2]]
广播相加结果 (3,3):
[[0 1 2]
[1 2 3]
[2 3 4]]广播过程:col_vector在第二个维度上从1广播到3,row_vector在第一个维度上从1广播到3。最终两者都变成(3,3)的形状再进行相加。
向量化与广播实战
为了巩固理解,我们用一个模拟的销售数据小例子,结合Pandas(其底层也依赖NumPy的向量化)来演示这些概念的实际应用。
import pandas as pd
import numpy as np
# 创建一个模拟的每日产品销售额DataFrame(单位:元)
# 行索引为日期,列名为产品
data = {
'产品A': [120, 150, 130],
'产品B': [300, 280, 320],
'产品C': [80, 95, 88]
}
df_sales = pd.DataFrame(data, index=['Day1', 'Day2', 'Day3'])
print("原始销售数据:")
print(df_sales)
print()
# 1. 向量化操作:所有产品价格打9折
df_sales_discount = df_sales * 0.9
print("所有产品打9折后:")
print(df_sales_discount)
print()
# 2. 广播操作:计算每日总销售额(各产品销售额之和)
daily_total = df_sales.sum(axis=1) # axis=1 对每行(每天)的各列(产品)求和
print("每日总销售额:")
print(daily_total)
print()
# 3. 广播操作:计算每种产品销售额与自身平均值的差值
product_mean = df_sales.mean(axis=0) # axis=0 对每列(产品)的各行(天)求平均
print("每种产品的平均销售额:")
print(product_mean)
print()
# 将产品平均值(一个一维Series)广播到与df_sales相同的形状,然后做减法
deviation = df_sales - product_mean # Pandas会自动沿行广播product_mean
print("每日销售额与产品平均值的差值:")
print(deviation)原始销售数据:
产品A 产品B 产品C
Day1 120 300 80
Day2 150 280 95
Day3 130 320 88
所有产品打9折后:
产品A 产品B 产品C
Day1 108.0 270.0 72.0
Day2 135.0 252.0 85.5
Day3 117.0 288.0 79.2
每日总销售额:
Day1 500
Day2 525
Day3 538
dtype: int64
每种产品的平均销售额:
产品A 133.333333
产品B 300.000000
产品C 87.666667
dtype: float64
每日销售额与产品平均值的差值:
产品A 产品B 产品C
Day1 -13.333333 0.0 -7.666667
Day2 16.666667 -20.0 7.333333
Day3 -3.333333 20.0 0.333333📝 动手练一练
- 概念辨析:向量化操作和Python的
for循环在处理数组运算时的主要区别是什么?至少列出两点。
👉 点击查看参考答案
- 代码简洁性:向量化操作通常只需一行代码即可表达对整个数组的运算,而
for循环需要多行代码来显式地遍历元素。 - 执行效率:NumPy的向量化操作底层由C/C++/Fortran等编译语言实现,执行速度比纯Python解释执行的
for循环快几个数量级,尤其对于大型数据集。 - 思维方式:向量化鼓励将数据视为整体进行操作,更符合数组编程的思维模式。
- 动手实践:给定一个二维NumPy数组
arr = np.array([[1, 2, 3], [4, 5, 6]]),请不显式使用循环,完成以下操作: a) 计算数组每一行的和。 b) 将数组的每个元素减去其所在列的平均值。
👉 点击查看参考答案
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6]])
# a) 计算每一行的和
row_sums = arr.sum(axis=1)
print("每一行的和:", row_sums) # 输出: [ 6 15]
# b) 计算每一列的平均值,然后广播相减
col_means = arr.mean(axis=0) # 形状为 (3,)
arr_centered = arr - col_means # 广播:arr (2,3) - col_means (3,)
print("\n减去列平均值后的数组:")
print(arr_centered)每一行的和: [ 6 15]
减去列平均值后的数组:
[[-1.5 -1.5 -1.5]
[ 1.5 1.5 1.5]]计算过程说明:列平均值 col_means 为 [2.5, 3.5, 4.5]。在减法运算中,col_means 被广播成与 arr 相同的形状(2行3列),然后进行对应元素相减。
本章小结
本节我们深入学习了NumPy中提升计算效率和代码简洁性的两大法宝:向量化与广播。
- 向量化让我们摆脱了低效的显式循环,能够以接近数学表达式的形式对整体数据进行操作,代码更清晰,运行更快速。
- 广播机制则赋予了向量化操作极大的灵活性,使得不同形状的数组(包括标量)之间能够智能地进行运算,它是NumPy众多强大功能得以实现的基础。
理解并熟练运用这两个概念,是迈向高效数据分析的关键一步。
📋 行动清单
- 尝试将一段使用
for循环处理列表的Python代码,改写成使用NumPy数组的向量化形式。 - 创建一个二维数组和一个一维数组,手动推演它们进行加法运算时的广播过程,并用代码验证你的推演。
- 在Pandas中选取一列数据(Series),对其进行向量化的数学运算(如加、减、乘、除一个标量),观察结果。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载本节课件:向量化介绍PDF · 289KB
- 下载全套课件打包(第1-5章)ZIP · 12.8MB
- 下载全套课件打包(第6-8章)ZIP · 15MB
- 下载实战数据集:AppleStore 应用商城分析ZIP · 329KB
- 下载实战数据集:女性服装电商分析ZIP · 2.8MB
- 下载Python 数据分析环境搭建指南PDF · 2MB
- 下载Scrapy 安装教程PDF · 12.7MB
- 下载附加实战项目:AppleStore 应用商城数据分析ZIP · 0.3MB · ipynb + CSV 数据
- 下载附加实战项目:银行电话营销数据分析ZIP · 0.4MB · ipynb + CSV 数据
- 下载附加实战项目:女性服装电商评论数据分析ZIP · 2.7MB · ipynb + CSV 数据
- 下载附加实战项目:美国化学学会杂志数据分析ZIP · 34.2MB · ipynb + SQLite 数据库