NumPy 算术函数
在 NumPy 中,算术函数(Arithmetic Functions)是一组用于对 ndarray
(N 维数组)执行基本算术运算的通用函数(ufunc),包括加、减、乘、除、幂、取模等操作。这些函数支持向量化操作和广播机制,能够高效处理数组元素,广泛应用于数据处理、科学计算和机器学习。以下是对 NumPy 算术函数的详细中文讲解,涵盖定义、常用函数、示例、注意事项及最佳实践,帮助你全面掌握 NumPy 算术函数的使用。
一、NumPy 算术函数概述
1. 什么是算术函数?
- 定义:NumPy 算术函数是对数组元素执行基本算术运算(如加、减、乘、除)的通用函数,支持标量、数组和多维数组操作。
- 特点:
- 向量化:逐元素运算,无需显式循环。
- 广播:自动扩展形状不完全相同的数组。
- 高效性:基于 C 实现,性能优于 Python 原生运算。
- 类型安全:自动处理数据类型转换。
- 用途:
- 数据处理:数组元素的基本运算。
- 特征缩放:如归一化、标准化。
- 数学建模:矩阵运算、向量计算。
2. 算术函数 vs Python 内置运算
特性 | NumPy 算术函数 | Python 内置运算 |
---|---|---|
输入类型 | 数组、标量 | 标量或列表(需循环) |
向量化 | 支持数组操作 | 需手动循环 |
广播 | 支持形状扩展 | 不支持 |
性能 | 高效(C 实现) | 较慢(Python 实现) |
二、常用 NumPy 算术函数
NumPy 提供了以下主要算术函数,均支持数组和标量操作,并遵循广播规则。以下按功能分类介绍。
1. 基本算术运算
这些函数对应常见的数学运算符,支持逐元素操作。
函数 | 运算符 | 描述 | 示例(标量) |
---|---|---|---|
np.add(x1, x2) | + | 加法 | 2 + 3 = 5 |
np.subtract(x1, x2) | - | 减法 | 5 - 2 = 3 |
np.multiply(x1, x2) | * | 乘法 | 2 * 3 = 6 |
np.divide(x1, x2) | / | 除法 | 6 / 2 = 3.0 |
np.floor_divide(x1, x2) | // | 整除 | 7 // 2 = 3 |
np.mod(x1, x2) | % | 取模 | 7 % 3 = 1 |
np.power(x1, x2) | ** | 幂运算 | 2 ** 3 = 8 |
- 语法:
np.<function>(x1, x2, out=None, dtype=None)
x1
,x2
:输入数组或标量。out
:可选输出数组,存储结果。dtype
:指定输出数据类型。- 示例:
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.subtract(arr2, arr1)) # 输出:[3 3 3]
print(np.multiply(arr1, 2)) # 输出:[2 4 6]
print(np.divide(arr2, 2)) # 输出:[2. 2.5 3.]
print(np.floor_divide(arr2, 2)) # 输出:[2 2 3]
print(np.mod(arr2, 3)) # 输出:[1 2 0]
print(np.power(arr1, 2)) # 输出:[1 4 9]
- 使用运算符(更简洁):
print(arr1 + arr2) # 等同于 np.add
print(arr1 * 2) # 等同于 np.multiply
2. 绝对值与符号
- 函数:
np.abs(x)
或np.absolute(x)
:绝对值。np.sign(x)
:返回元素符号(1、0、-1)。- 示例:
arr = np.array([-2, 0, 3])
print(np.abs(arr)) # 输出:[2 0 3]
print(np.sign(arr)) # 输出:[-1 0 1]
3. 倒数运算
- 函数:
np.reciprocal(x)
:计算倒数(1/x),对整数返回整数倒数。- 示例:
arr = np.array([1, 2, 4], dtype=np.float64)
print(np.reciprocal(arr)) # 输出:[1. 0.5 0.25]
4. 累积运算
- 函数:
np.cumsum(arr, axis=None)
:累积和。np.cumprod(arr, axis=None)
:累积积。- 示例:
arr = np.array([1, 2, 3])
print(np.cumsum(arr)) # 输出:[1 3 6]
print(np.cumprod(arr)) # 输出:[1 2 6]
- 多维示例:
arr = np.array([[1, 2], [3, 4]])
print(np.cumsum(arr, axis=0)) # 按列累积
# 输出:
# [[1 2]
# [4 6]]
三、广播机制
算术函数支持 NumPy 的广播机制,允许不同形状的数组运算。
- 示例(标量与数组):
arr = np.array([[1, 2], [3, 4]])
print(arr + 5) # 标量广播
# 输出:
# [[6 7]
# [8 9]]
- 示例(数组与向量):
arr = np.array([[1, 2], [3, 4]]) # 形状 (2, 2)
vec = np.array([10, 20]) # 形状 (2,)
print(arr + vec) # vec 广播为 (2, 2)
# 输出:
# [[11 22]
# [13 24]]
四、实际应用场景
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.]
2. 批量运算
对矩阵元素批量加减:
matrix = np.array([[1, 2], [3, 4]])
result = np.add(matrix, 10)
print(result) # 输出:[[11 12] [13 14]]
3. 累积统计
计算时间序列的累积和:
data = np.array([1, 2, 3, 4])
cumulative = np.cumsum(data)
print(cumulative) # 输出:[1 3 6 10]
4. 整数处理
处理整数数组的整除和取模:
arr = np.array([10, 15, 20])
print(np.floor_divide(arr, 3)) # 输出:[3 5 6]
print(np.mod(arr, 3)) # 输出:[1 0 2]
五、注意事项
- 数据类型转换:
- 除法(
np.divide
)将整数转换为浮点数:python arr = np.array([1, 2], dtype=np.int32) print(np.divide(arr, 2).dtype) # 输出:float64
- 除零错误:
- 除法或取模可能产生无效值:
python arr = np.array([1, 0]) print(np.divide(1, arr)) # 输出:[1. inf]
- 广播兼容性:
- 确保数组形状满足广播规则:
python arr1 = np.array([[1, 2], [3, 4]]) # 形状 (2, 2) arr2 = np.array([1, 2, 3]) # 形状 (3,) # arr1 + arr2 # 报错:形状不兼容
- 性能优化:
- 向量化运算比循环快:
python arr = np.array([1, 2, 3]) print(np.multiply(arr, 2)) # 高效
- 输出数组:
- 使用
out
参数避免创建新数组:python result = np.empty_like(arr) np.add(arr, 2, out=result)
六、最佳实践
- 优先向量化:
- 使用算术函数或运算符,避免循环:
python arr = np.array([1, 2, 3]) print(arr * 2) # 高效
- 显式数据类型:
- 指定
dtype
控制输出类型:python arr = np.array([1, 2], dtype=np.float32) print(np.divide(arr, 2, dtype=np.float32))
- 处理无效值:
- 检查
inf
或nan
:python result = np.divide(1, np.array([0, 1])) print(np.isinf(result)) # 输出:[ True False]
- 优化内存:
- 使用
out
参数复用数组:python result = np.zeros_like(arr) np.multiply(arr, 2, out=result)
- 结合其他库:
- 与 Pandas 集成:
python import pandas as pd df = pd.DataFrame(arr) df += 2 # 类似 NumPy 广播
- 调试形状:
- 检查数组形状:
python print(arr1.shape, arr2.shape)
七、总结
NumPy 的算术函数(如 add
、subtract
、multiply
、divide
、power
)提供了高效的向量化运算,支持加、减、乘、除、幂等操作,结合广播机制可处理不同形状的数组。掌握这些函数,理解数据类型转换和广播规则,遵循最佳实践(如向量化、处理无效值、优化内存),能显著提升数据处理效率。注意除零、形状兼容性和性能优化,确保代码的正确性和高效性。
如果你需要更复杂的算术运算示例(如多维矩阵运算、性能优化)或特定场景的代码,请告诉我!