← 返回《Python 数据分析实战》
📑 查看全课大纲(第 32 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.D绘图 -- mplot3d
  82. 82.D曲线可视化
  83. 83.D散点图可视化
  84. 84.D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

向量化及通用函数

约 7 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

向量化通用函数族:NumPy ufunc 元素级数学映射与矩阵乘法辨析

小象实战讲义 · Python数据分析实战

在科学计算与特征工程中,我们经常需要对数据集中的每一个元素执行非线性数学变换(如取对数、指数映射、三角函数、向上/向下取整)或者处理缺失值(NaN 判断)。NumPy 提供了一套极其庞大且高效的**通用函数(Universal Functions,简称 ufunc)体系。ufunc 是一类能够对 ndarray 中的数据执行逐元素(Element-wise)极速运算的函数封装。本节我们将深入学习一元与二元常用 ufunc 函数,并重点澄清数据分析中最容易混淆的逐元素乘法(*)与矩阵代数点乘(@ / dot)**的本质差异。

💡 核心导读

  • 通用函数 ufunc 的核心概念与分类
    • 一元 ufunc(Unary ufuncs):接收单个数组输入,返回等形状变换结果;
    • 二元 ufunc(Binary ufuncs):接收两个数组输入,结合广播机制执行双向逐元素计算。
  • 高频一元 ufunc 精讲
    • 整数近似:np.ceil()(向上取整)、np.floor()(向下取整)、np.rint()(四舍五入);
    • 代数变换:np.sqrt()np.exp()np.log() / np.log1p()(平滑变换)、np.abs()
    • 缺失值探针:np.isnan()np.isinf()np.isfinite()
  • 逐元素乘法 vs 矩阵代数乘法核心辨析
    • np.multiply(A, B) / A * B:哈达玛积(逐对应位置相乘);
    • np.dot(A, B) / A @ B / np.matmul(A, B):经典线性代数矩阵乘法(行乘以列累加)。

1. 常见 ufunc 函数分类速查

┌─────────────────────────────────────────────────────────────┐
│                    NumPy 常用通用函数 (ufunc) 矩阵          │
├─────────────────┬───────────────────────────────────────────┤
│ 类别            │ 核心函数及作用                            │
├─────────────────┼───────────────────────────────────────────┤
│ 1. 舍入取整     │ np.ceil() 向上, np.floor() 向下, np.rint()│
│ 2. 数学变换     │ np.sqrt() 开方, np.exp() 指数, np.log()   │
│ 3. 缺失与异常   │ np.isnan() 是否非数, np.isinf() 是否无穷  │
│ 4. 逐元素极值   │ np.maximum(A, B), np.minimum(A, B)        │
│ 5. 逐元素四则   │ np.add(), np.subtract(), np.multiply()    │
└─────────────────┴───────────────────────────────────────────┘

2. 核心辨析:逐元素乘法(*) vs 矩阵点乘(@

这是所有初学者最容易踩坑的地方:

┌─────────────────────────────────────────────────────────────┐
│ 1. 逐元素乘法 (A * B) : 要求形状相同或可广播, 对应位置相乘   │
│    [ [ 1, 2 ],  *  [ [ 5, 6 ],  =  [ [ 1*5, 2*6 ],         │
│      [ 3, 4 ] ]      [ 7, 8 ] ]       [ 3*7, 4*8 ] ]        │
├─────────────────────────────────────────────────────────────┤
│ 2. 矩阵乘法 (A @ B) : 要求 A 的列数等于 B 的行数, 行列点积  │
│    [ [ 1, 2 ],  @  [ [ 5, 6 ],  =  [ [ 1*5+2*7, 1*6+2*8 ], │
│      [ 3, 4 ] ]      [ 7, 8 ] ]       [ 3*5+4*7, 3*6+4*8 ] ]│
└─────────────────────────────────────────────────────────────┘

3. Python 代码实战:ufunc 运算与矩阵乘法

# 示例 1:常用一元 ufunc 函数实战 (取整、数学变换与 NaN 检测)

import numpy as np

# 1. 浮点数取整运算
float_samples = np.array([-1.7, -1.2, 0.2, 1.5, 1.8, 2.3])
print("=== 1. 浮点数取整 ufunc ===")
print("原始数据:", float_samples)
print("• 向上取整 (ceil):", np.ceil(float_samples))
print("• 向下取整 (floor):", np.floor(float_samples))
print("• 四舍五入 (rint):", np.rint(float_samples))

# 2. 对数与指数变换 (常用于数据平滑与偏态校正)
positive_data = np.array([1, 10, 100, 1000], dtype=np.float64)
print("\n=== 2. 对数与指数映射 ===")
print("以 e 为底的自然对数 (log):", np.round(np.log(positive_data), 2))
print("以 10 为底的对数 (log10):", np.log10(positive_data))

# 3. 缺失值 NaN 检测与安全过滤
dirty_data = np.array([10.5, np.nan, 25.0, np.nan, 40.0])
print("\n=== 3. 缺失值 NaN 嗅探与清洗 ===")
print("原始脏数据:", dirty_data)
nan_mask = np.isnan(dirty_data)
print("NaN 布尔掩码:", nan_mask)
clean_data = dirty_data[~nan_mask] # 使用 ~ 反转掩码
print("过滤 NaN 后的纯净数组:", clean_data)

接下来演示逐元素乘法与矩阵代数乘法的对比,以及 np.maximum 的应用:

# 示例 2:逐元素乘法 (Hadamard Product) vs 矩阵代数乘法 (Dot Product)

# 定义两个 2x2 方阵
mat_A = np.array([[1, 2], [3, 4]])
mat_B = np.array([[5, 6], [7, 8]])

print("\n=== 4. 乘法运算本质对比 ===")
print("矩阵 A:\n", mat_A)
print("矩阵 B:\n", mat_B)

# 1. 逐元素相乘 (等价于 np.multiply(mat_A, mat_B))
elem_mult = mat_A * mat_B
print("\n• 逐元素乘法 (A * B):\n", elem_mult)

# 2. 矩阵代数乘法 (等价于 np.dot(mat_A, mat_B) 或 np.matmul(mat_A, mat_B))
# 第一行第一列: 1*5 + 2*7 = 19; 第一行第二列: 1*6 + 2*8 = 22
matrix_mult = mat_A @ mat_B
print("• 矩阵代数乘法 (A @ B):\n", matrix_mult)

# 3. 二元比较 ufunc:np.maximum 与 np.minimum (逐位置取较大/较小值)
arr_x = np.array([10, 50, 30, 80])
arr_y = np.array([20, 40, 60, 70])
print("\n=== 5. 逐元素比较取极值 ===")
print("数组 X:", arr_x)
print("数组 Y:", arr_y)
print("• 逐位置取最大值 (np.maximum):", np.maximum(arr_x, arr_y))
print("• 逐位置取最小值 (np.minimum):", np.minimum(arr_x, arr_y))

📝 动手练一练

  1. 辨析题:在处理包含缺失值的数据时,为什么不能使用 val == np.nan 来判断某个元素是否为空?正确的判断方法是什么?

    👉 点击查看参考答案

    参考答案: ① 原因:根据 IEEE 754 浮点数标准,NaN(Not a Number)与任何值都不相等,甚至 np.nan == np.nan 的返回值也是 False; ② 正确做法:必须使用通用函数 np.isnan(val)pd.isna(val) 来检测缺失值。

  2. 编程练习:给定向量 x = np.array([-5, -2, 0, 3, 7]),请使用 ufunc 实现机器学习中著名的 ReLU 激活函数(即 $f(x) = \max(0, x)$,将所有负数截断为 0,正数保持不变)。

    👉 点击查看参考答案

    参考答案

    import numpy as np
    
    x = np.array([-5, -2, 0, 3, 7])
    relu_out = np.maximum(0, x) # 利用 0 标量与 x 进行 ufunc 广播比较
    print("ReLU 变换结果:", relu_out)

本章小结

在本节中,我们全面掌握了 NumPy 通用函数 ufunc 的核心体系:

  • 掌握了 ceilfloorrintsqrtlog 等常见一元 ufunc;
  • 学会了使用 np.isnan() 准确嗅探与清洗缺失数据;
  • 深刻厘清了逐元素相乘(A * B)与矩阵代数点乘(A @ B)的本质边界;
  • 掌握了 np.maximum 等二元比较函数在特征截断中的高阶用法。

📋 行动清单

  • 牢记 A * BA @ B 的差异,避免在算法中用错乘法。
  • 做好准备,进入第 4 章压轴大实战——《实战:2016 美国大选民调数据统计分析》!

—— 小象教研组

配套学习资源与课件
  • 本节课件:向量化及通用函数(PDF · 260KB)
    下载
  • 全套课件打包(第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 数据库)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加课程顾问,免费获取网盘下载链接
微信二维码:扫码添加课程顾问微信扫码添加顾问