NumPy 数学函数
在 NumPy 中,数学函数(Mathematical Functions)是一组用于对 ndarray
(N 维数组)执行数学运算的工具函数,称为通用函数(ufunc)。这些函数支持向量化操作,能够高效处理数组元素,涵盖算术、统计、三角、指数、对数等运算,广泛应用于科学计算、数据分析和机器学习。以下是对 NumPy 数学函数的详细中文讲解,涵盖定义、主要函数、示例、注意事项及最佳实践,帮助你全面掌握 NumPy 数学函数的使用。
一、NumPy 数学函数概述
1. 什么是数学函数?
- 定义:NumPy 数学函数是
np
模块中的通用函数(ufunc),对数组元素逐个执行数学运算,支持广播和向量化。 - 特点:
- 向量化:无需显式循环,自动应用于数组每个元素。
- 高效性:基于 C 实现,性能优于 Python 原生运算。
- 多维支持:适用于任意维度的数组。
- 广播:自动扩展形状不完全相同的数组。
- 用途:
- 数据处理:计算数组的统计量(如均值、标准差)。
- 数学建模:三角函数、指数、对数等。
- 数据预处理:归一化、特征缩放等。
2. 数学函数 vs Python 内置数学模块
特性 | NumPy 数学函数 | Python math 模块 |
---|---|---|
输入类型 | 数组(标量、向量、矩阵) | 标量 |
向量化 | 支持数组操作 | 需循环处理数组 |
性能 | 高效(C 实现) | 较慢(Python 实现) |
广播 | 支持形状扩展 | 不支持 |
二、常用 NumPy 数学函数
NumPy 提供了丰富的数学函数,以下按类别介绍常用函数及其用法。
1. 算术运算
- 函数:
np.add(x1, x2)
:加法(等同于x1 + x2
)。np.subtract(x1, x2)
:减法(x1 - x2
)。np.multiply(x1, x2)
:乘法(x1 * x2
)。np.divide(x1, x2)
:除法(x1 / x2
)。np.power(x1, x2)
:幂运算(x1 ** x2
)。np.mod(x1, x2)
:取模(x1 % x2
)。- 示例:
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(np.add(arr1, arr2)) # 输出:[5 7 9]
print(np.multiply(arr1, 2)) # 输出:[2 4 6]
print(np.power(arr1, 2)) # 输出:[1 4 9]
print(np.mod(arr2, 3)) # 输出:[1 2 0]
2. 统计函数
- 函数:
np.mean(arr, axis=None)
:计算均值。np.std(arr, axis=None)
:计算标准差。np.var(arr, axis=None)
:计算方差。np.sum(arr, axis=None)
:求和。np.max(arr, axis=None)
:最大值。np.min(arr, axis=None)
:最小值。np.median(arr, axis=None)
:中位数。- 示例:
arr = np.array([[1, 2], [3, 4]])
print(np.mean(arr)) # 输出:2.5
print(np.std(arr, axis=0)) # 输出:[1. 1.](按列标准差)
print(np.sum(arr, axis=1)) # 输出:[3 7](按行求和)
print(np.max(arr)) # 输出:4
3. 三角函数
- 函数:
np.sin(arr)
:正弦。np.cos(arr)
:余弦。np.tan(arr)
:正切。np.arcsin(arr)
:反正弦。np.deg2rad(arr)
:角度转弧度。np.rad2deg(arr)
:弧度转角度。- 示例:
arr = np.array([0, np.pi/2, np.pi])
print(np.sin(arr)) # 输出:[0. 1. 0.]
print(np.deg2rad([0, 90, 180])) # 输出:[0. 1.57 3.14]
4. 指数与对数
- 函数:
np.exp(arr)
:自然指数(e^x)。np.log(arr)
:自然对数(ln(x))。np.log10(arr)
:以 10 为底的对数。np.sqrt(arr)
:平方根。- 示例:
arr = np.array([1, 2, 3])
print(np.exp(arr)) # 输出:[2.72 7.39 20.09]
print(np.log(arr)) # 输出:[0. 0.69 1.1]
print(np.sqrt(arr)) # 输出:[1. 1.41 1.73]
5. 舍入与绝对值
- 函数:
np.round(arr, decimals=0)
:四舍五入。np.floor(arr)
:向下取整。np.ceil(arr)
:向上取整。np.abs(arr)
:绝对值。- 示例:
arr = np.array([1.7, 2.3, -3.5])
print(np.round(arr)) # 输出:[2. 2. -4.]
print(np.floor(arr)) # 输出:[1. 2. -4.]
print(np.abs(arr)) # 输出:[1.7 2.3 3.5]
6. 其他数学函数
- 函数:
np.sign(arr)
:返回元素符号(1、0、-1)。np.reciprocal(arr)
:倒数(1/x)。np.clip(arr, a_min, a_max)
:限制元素在指定范围内。- 示例:
arr = np.array([-2, 0, 3])
print(np.sign(arr)) # 输出:[-1 0 1]
print(np.clip(arr, 0, 2)) # 输出:[0 0 2]
三、实际应用场景
1. 数据标准化
将数组归一化到零均值和单位方差:
arr = np.array([[1, 2], [3, 4]])
mean = np.mean(arr, axis=0)
std = np.std(arr, axis=0)
normalized = (arr - mean) / std
print(normalized)
# 输出:
# [[-1. -1.]
# [ 1. 1.]]
2. 三角函数绘图
生成正弦波数据:
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
# 可用于 Matplotlib 绘图
3. 特征缩放
将数据缩放到 [0, 1]:
arr = np.array([1, 2, 3, 4])
min_val, max_val = np.min(arr), np.max(arr)
scaled = (arr - min_val) / (max_val - min_val)
print(scaled) # 输出:[0. 0.33 0.67 1.]
4. 指数增长
模拟指数增长:
t = np.arange(0, 5, 0.5)
growth = np.exp(t)
print(growth)
# 输出:[1. 1.65 2.72 ... 148.41]
四、注意事项
- 数据类型:
- 运算可能改变
dtype
(如整数除法生成浮点数):python arr = np.array([1, 2], dtype=np.int32) print((arr / 2).dtype) # 输出:float64
- 数值范围:
- 注意溢出或无效值(如
np.log(0)
返回-inf
):python arr = np.array([0, 1]) print(np.log(arr)) # 输出:[-inf 0.]
- 广播兼容性:
- 确保数组形状满足广播规则:
python arr1 = np.array([[1, 2], [3, 4]]) arr2 = np.array([1, 2]) print(np.add(arr1, arr2)) # 广播合法
- 性能优化:
- 向量化操作比循环快,优先使用:
python arr = np.array([1, 2, 3]) print(np.sin(arr)) # 高效
- 轴(axis)指定:
- 统计函数需明确轴:
python arr = np.array([[1, 2], [3, 4]]) print(np.mean(arr, axis=1)) # 按行均值:[1.5 3.5]
五、最佳实践
- 向量化优先:
- 使用 NumPy 函数避免循环:
python arr = np.array([1, 2, 3]) print(np.power(arr, 2)) # 输出:[1 4 9]
- 检查数据类型:
- 显式指定
dtype
避免意外转换:python arr = np.array([1, 2], dtype=np.float32)
- 处理无效值:
- 使用
np.isnan
或np.isfinite
检查结果:python arr = np.array([0, 1]) result = np.log(arr) print(np.isinf(result)) # 输出:[ True False]
- 优化性能:
- 大数组使用低精度类型(如
float32
):python arr = np.array([1, 2, 3], dtype=np.float32)
- 结合其他库:
- 与 Pandas、Matplotlib 集成:
python import pandas as pd df = pd.DataFrame(arr) print(np.mean(df, axis=0))
- 调试输出:
- 使用
np.set_printoptions
控制精度:python np.set_printoptions(precision=2)
六、总结
NumPy 的数学函数(ufunc
)提供了高效的向量化运算,涵盖算术(add
、multiply
)、统计(mean
、std
)、三角(sin
、cos
)、指数对数(exp
、log
)等操作。掌握这些函数,理解广播和数据类型,结合最佳实践(如向量化、检查无效值、优化性能),能高效处理数组数据。注意数值范围、轴指定和性能优化,确保代码的正确性和效率。
如果你需要更复杂的数学函数示例(如多维运算、性能优化)或特定场景的代码,请告诉我!