人工智能之数据分析 numpy
第九章 数组运算(二)
文章目录
- 前言
- 一、三角函数(Trigonometric Functions)
- 二、双曲函数(Hyperbolic Functions)
- 三、指数与对数函数
- 四、舍入函数(Rounding)
- 五、向量与矩阵函数(线性代数相关)
- 六、统计相关函数
- 七、特殊函数(SciPy 更全,但 NumPy 有基础)
- 八、随机数生成(
np.random模块) - 九、性能提示
- 十、总结:常用函数速查表
- 后续
前言
NumPy 提供了大量数学和统计相关的通用函数(ufunc),涵盖三角函数、指数对数运算、舍入操作、线性代数计算以及概率统计等多个方面。这些函数均支持向量化处理,能够直接作用于整个数组而无需显式循环,显著提升计算效率。
本文将系统介绍 NumPy 中常用的数学与统计函数,延续上一章节内容进行深入讲解。
三、指数与对数函数
NumPy 支持多种常见的指数和对数运算,适用于科学计算中的数值稳定性需求。
| 函数 | 说明 |
|---|---|
| $e^x$ |
| $2^x$ |
| $x^y$(支持广播) |
| 自然对数 $\ln x$ |
| 以 2 为底的对数 |
| 以 10 为底的对数 |
| $\ln(1 + x)$,在 $x$ 很小时更精确 |
示例:
import numpy as np
x = np.array([1, 2, np.e])
print("exp:", np.exp(x)) # [2.718..., 7.389..., 15.154...]
print("log(exp(x)):", np.log(np.exp(x))) # ≈ x
# 使用 log1p 避免小数值精度损失
small = 1e-10
print(np.log(1 + small)) # 可能输出 0.0(精度丢失)
print(np.log1p(small)) # 精确值 ≈ 1e-10
一、三角函数(Trigonometric Functions)
所有三角函数默认接收弧度制输入,需注意角度与弧度之间的转换。
| 函数 | 说明 |
|---|---|
| 正弦 |
| 余弦 |
| 正切 |
| 反正弦 |
| 反余弦 |
| 反正切 |
| 计算 $\sqrt{x^2 + y^2}$(直角三角形斜边) |
| 角度转弧度 |
| 同上 |
| 弧度转角度 |
| 同上 |
示例:
angles_deg = np.array([0, 30, 45, 60, 90])
angles_rad = np.deg2rad(angles_deg)
print("sin:", np.sin(angles_rad))
# 输出: [0. 0.5 0.70710678 0.8660254 1. ]
# 反函数使用示例(注意定义域限制)
x = np.array([0, 0.5, 1])
print("arcsin (rad):", np.arcsin(x))
print("arcsin (deg):", np.rad2deg(np.arcsin(x)))
# 输出: [0. 30. 90.]
注意:
arcsin 和 arccos 的输入必须位于区间 $[-1, 1]$ 内,否则会返回 nan(如 NaN)。
二、双曲函数(Hyperbolic Functions)
双曲函数在机器学习激活函数及微分方程求解中具有应用价值。
| 函数 | 说明 |
|---|---|
| 双曲正弦 |
| 双曲余弦 |
| 双曲正切 |
| 反双曲正弦 |
| 反双曲余弦 |
| 反双曲正切 |
四、舍入函数(Rounding)
用于控制浮点数的小数位数或整数化处理。
| 函数 | 说明 |
|---|---|
| 四舍五入到指定小数位 |
| 同上 |
| 向下取整(≤ x 的最大整数) |
| 向上取整(≥ x 的最小整数) |
| 截断小数部分(向零取整) |
| 同上 |
| 四舍五入到最近整数,返回 float 类型 |
示例:
x = np.array([-2.7, -2.3, 2.3, 2.7])
print("round :", np.round(x)) # [-3. -2. 2. 3.]
print("floor :", np.floor(x)) # [-3. -3. 2. 2.]
print("ceil :", np.ceil(x)) # [-2. -2. 3. 3.]
print("trunc :", np.trunc(x)) # [-2. -2. 2. 2.]
补充说明:
np.round() 采用“银行家舍入”规则,即当处于两个整数中间时,舍入至最近的偶数。例如 0.5 会舍入到 np.round(2.5) → 2.0 所表示的偶数值。
五、向量与矩阵函数(线性代数相关)
尽管完整的线性代数功能主要由 numpy.linalg 模块提供,但 NumPy 基础库仍包含若干常用向量与矩阵操作函数,适用于基本的数学运算需求。
np.linalg 表示该部分内容通常归属于专门的线性代数模块,但在实际使用中可通过主命名空间调用部分核心函数。
六、统计相关函数
NumPy 提供丰富的统计分析工具,支持沿指定轴(axis)进行计算。
1. 基础统计量(支持 axis 参数)
- 均值:
np.mean() - 标准差:
np.std() - 方差:
np.var() - 最小/最大值:
np.min(),np.max() - 求和:
np.sum() - 累积和:
np.cumsum()
2. 高级统计
- 中位数:
np.median() - 百分位数:
np.percentile() - 相关系数矩阵:
np.corrcoef() - 协方差矩阵:
np.cov()
示例:
data = np.array([[1, 2], [3, 4], [5, 6]])
print("Mean along axis=0:", np.mean(data, axis=0)) # [3. 4.]
print("Median:", np.median(data))
print("Covariance matrix:\n", np.cov(data.T))
七、特殊函数(SciPy 更全,但 NumPy 有基础)
虽然 SciPy 提供更为全面的特殊数学函数,但 NumPy 也实现了部分基础功能,如限幅与插值等。
示例:限幅与插值
利用 np.clip() 实现数组元素的上下界限制,或通过 np.interp() 进行一维线性插值。
arr = np.array([1, 2, 3, 4, 5])
clipped = np.clip(arr, 2, 4) # 将小于2的设为2,大于4的设为4
print(clipped) # [2 2 3 4 4]
# 插值示例
x = np.array([1, 3, 5])
xp = [1, 2, 3, 4, 5]
fp = [1, 4, 9, 16, 25] # 对应平方函数
interpolated = np.interp(x, xp, fp)
print(interpolated) # [1. 4. 9.] (线性近似)
八、随机数生成(np.random 模块)
NumPy 的 random 模块可用于生成各种分布下的随机样本,常用于模拟、建模和初始化参数。
np.random.rand():均匀分布随机数np.random.randn():标准正态分布np.random.randint():整数随机数np.random.choice():从给定数组中抽样np.random.seed():设置随机种子以保证可重复性
九、性能提示
- 优先使用向量化操作而非 Python 循环。
- 避免频繁创建临时数组,合理复用内存。
- 使用
out参数就地存储结果以节省内存(如np.sin(arr, out=arr))。 - 对于大型数组,考虑使用
dtype控制精度以减少内存占用。 - 启用 Numba 或 CuPy 可进一步加速计算密集型任务。
十、总结:常用函数速查表
| 类别 | 函数示例 |
|---|---|
| 三角函数 | np.sin, np.cos, np.tan, np.arcsin, np.deg2rad |
| 指数/对数 | np.exp, np.log, np.log1p, np.power |
| 舍入操作 | np.round, np.floor, np.ceil, np.trunc |
| 统计函数 | np.mean, np.std, np.median, np.sum |
| 线性代数 | np.dot, np.matmul, np.linalg.inv |
| 随机数 | np.random.rand, np.random.randn, np.random.choice |
后续
本系列将持续更新关于数据分析中 NumPy、Pandas、Matplotlib 等工具的实际应用技巧与进阶方法,敬请期待下一章节内容。
常用函数概述(主命名空间)
以下为 NumPy 中常用的数学与数组操作函数,均位于主命名空间,可直接调用。
| 函数 | 说明 |
|---|---|
np.dot |
计算点积或矩阵乘法 |
np.vdot |
共轭点积,常用于复数向量 |
np.inner |
内积运算,对高维数组沿最后一轴求和 |
np.outer |
外积运算,返回二维矩阵结果 |
np.cross |
向量叉积,适用于 2D 或 3D 向量 |
np.linalg.norm |
计算向量或矩阵的范数,默认为 L2 范数 |
np.dot(a, b)
np.vdot(a, b)
np.inner(a, b)
np.outer(a, b)
np.cross(a, b)
np.linalg.norm(x, ord=2)
示例代码:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print("dot :", np.dot(a, b)) # 输出:32
print("inner :", np.inner(a, b)) # 输出:32
print("outer :\n", np.outer(a, b))
# [[ 4 5 6]
# [ 8 10 12]
# [12 15 18]]
print("norm :", np.linalg.norm(a)) # √14 ≈ 3.7417
六、统计相关函数
1. 基础统计量(支持 axis 参数)
这些函数可用于沿指定轴进行统计计算。
| 函数 | 说明 |
|---|---|
np.sum |
数组元素求和 |
np.mean |
计算均值 |
np.median |
中位数 |
np.std |
标准差,默认除以 N(总体标准差) |
np.var |
方差 |
np.min, np.max |
最小值与最大值 |
np.argmin, np.argmax |
最小值与最大值的索引位置 |
np.percentile |
分位数计算(q 取值范围为 0~100) |
np.quantile |
分位数计算(q 取值范围为 0~1) |
axis
np.sum(a)
np.mean(a)
np.median(a)
np.std(a)
np.var(a)
np.min(a)
np.max(a)
np.argmin(a)
np.argmax(a)
np.percentile(a, q)
np.quantile(a, q)
注意:默认的 np.std 和 np.var 使用总体标准差(除以 N)。若需样本标准差(除以 N-1),应设置参数 ddof=1。
np.std()
ddof=0
np.std(a, ddof=1)
2. 高级统计函数
适用于更复杂的统计分析任务。
| 函数 | 说明 |
|---|---|
np.cov |
计算协方差矩阵 |
np.corrcoef |
生成相关系数矩阵 |
np.histogram |
返回数据的频次分布及边界值(counts 和 bin_edges) |
np.bincount |
对非负整数数组进行频次统计,类似 one-hot 计数 |
np.unique |
提取唯一值及其出现次数 |
np.cov(x, y)
np.corrcoef(x, y)
np.histogram(a, bins=10)
np.bincount(x)
np.unique(a, return_counts=True)
np.sign(x)
示例代码:
data = np.array([1, 2, 2, 3, 4, 4, 4])
# 频次统计
values, counts = np.unique(data, return_counts=True)
print("Unique:", values) # [1 2 3 4]
print("Counts:", counts) # [1 2 1 3]
# 相关系数
x = np.array([1, 2, 3, 4])
y = np.array([2, 4, 6, 8])
print("Corr coef:", np.corrcoef(x, y)[0, 1]) # 1.0(完全正相关)
七、特殊函数(基础功能,SciPy 更全面)
NumPy 提供了一些常用的数学变换与处理函数。
| 函数 | 说明 |
|---|---|
np.sign |
符号函数,返回 -1、0 或 1 |
np.abs / np.fabs |
绝对值计算 |
np.sqrt |
平方根 |
np.square |
平方运算 |
np.clip |
数值限幅(clamp),限制在指定区间内 |
np.where |
根据条件选择元素 |
np.interp |
一维线性插值 |
np.abs(x)
np.fabs(x)
np.sqrt(x)
np.square(x)
np.clip(a, a_min, a_max)
np.where(condition, x, y)
np.interp(x, xp, fp)
示例:限幅与插值
arr = np.array([-2, -1, 0, 1, 2]) clipped = np.clip(arr, -1, 1) # 结果:[-1 -1 0 1 1] # 插值示例:已知 xp=[0,1,2], fp=[0,1,4],求 x=0.5 处的插值 x_new = 0.5 y_new = np.interp(x_new, [0,1,2], [0,1,4]) # 结果:0.5
八、随机数生成(np.random 模块)
该模块广泛应用于统计模拟与数据采样。
# 推荐使用新式随机数生成器 rng = np.random.default_rng(seed=42) rng.random(5) # 生成 [0,1) 区间内的均匀分布随机数 rng.normal(0, 1, 1000) # 从标准正态分布中抽取 1000 个样本 rng.randint(0, 10, 5) # 生成 5 个 [0,10) 范围内的随机整数 rng.choice([1,2,3], size=5) # 从给定序列中随机抽样
建议:优先使用 default_rng() 创建的生成器,取代旧式的 np.random.rand 等函数,以获得更好的随机性控制和可重现性。
np.random
Generator
default_rng
np.random.seed()
九、性能优化提示
- 上述所有函数均为 ufunc(通用函数),底层由 C 实现,具备自动向量化和并行化能力。
- 避免在 Python 循环中逐个调用这些函数,应直接作用于整个数组以发挥最大性能。
- 对于超大规模数组,建议采用内存映射(memmap)或分块处理策略,减少内存占用。
十、总结:常用函数速查表
| 类别 | 常用函数 |
|---|---|
| 三角函数 | np.sin, np.cos, np.tan, np.arcsin, np.arctan |
| 指数与对数 | np.exp, np.log, np.log10, np.power |
| 舍入操作 | np.round, np.floor, np.ceil, np.trunc |
| 向量运算 | np.dot, np.cross, np.outer, np.linalg.norm |
| 统计函数 | np.sum, np.mean, np.std, np.var, np.median, np.corrcoef |
sin
cos
tan
arcsin
deg2rad
exp
log
log10
log1p
round
floor
ceil
trunc
dot
norm
cross
outer
mean
std
median
percentile
unique掌握这些函数后,你将能够高效地完成科学计算、数据分析、信号处理以及机器学习中的大多数数值任务。对于更复杂的统计建模需求,例如回归分析或假设检验,推荐结合使用 SciPy.stats 或 statsmodels 等工具库进行扩展。
本文是前一章节的延续,重点讲解了与 NumPy 数组相关的数学运算和统计方法。
corrcoef
目前,Python 过渡项目的部分代码已上传至 Gitee 平台,并将持续更新。由于时间因素限制,进度可能较为缓慢,感兴趣的读者也可自行克隆源码到本地进行学习与功能拓展。
abs
以下是一些值得参考的学习资料:
- 《Python编程:从入门到实践》
- 《利用Python进行数据分析》
- 《算法导论中文第三版》
- 《概率论与数理统计(第四版)》(盛骤)
- 《程序员的数学》
- 《线性代数应该这样学第3版》
- 《微积分和数学分析引论》
- 《机器学习》(周志华,俗称“西瓜书”)
- 《TensorFlow机器学习实战指南》
- 《Sklearn与TensorFlow机器学习实用指南》
- 《模式识别(第四版)》
- 《深度学习》(伊恩·古德费洛,又称“花书”)
- 《Python深度学习第二版(中文版)》(Francois Chollet)
- 《深入浅出神经网络与深度学习》(迈克尔·尼尔森)
- 《自然语言处理综论 第2版》
- 《Natural-Language-Processing-with-PyTorch》
- 《计算机视觉-算法与应用(中文版)》
- 《Learning OpenCV 4》
- 《AIGC:智能创作时代》(杜雨 + 张孜铭)
- 《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
- 《从零构建大语言模型(中文版)》
- 《实战AI大模型》
- 《AI 3.0》
sign
clip
where
interp

雷达卡


京公网安备 11010802022788号







