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]

五、注意事项

  1. 数据类型转换
  • 除法(np.divide)将整数转换为浮点数:
    python arr = np.array([1, 2], dtype=np.int32) print(np.divide(arr, 2).dtype) # 输出:float64
  1. 除零错误
  • 除法或取模可能产生无效值:
    python arr = np.array([1, 0]) print(np.divide(1, arr)) # 输出:[1. inf]
  1. 广播兼容性
  • 确保数组形状满足广播规则:
    python arr1 = np.array([[1, 2], [3, 4]]) # 形状 (2, 2) arr2 = np.array([1, 2, 3]) # 形状 (3,) # arr1 + arr2 # 报错:形状不兼容
  1. 性能优化
  • 向量化运算比循环快:
    python arr = np.array([1, 2, 3]) print(np.multiply(arr, 2)) # 高效
  1. 输出数组
  • 使用 out 参数避免创建新数组:
    python result = np.empty_like(arr) np.add(arr, 2, out=result)

六、最佳实践

  1. 优先向量化
  • 使用算术函数或运算符,避免循环:
    python arr = np.array([1, 2, 3]) print(arr * 2) # 高效
  1. 显式数据类型
  • 指定 dtype 控制输出类型:
    python arr = np.array([1, 2], dtype=np.float32) print(np.divide(arr, 2, dtype=np.float32))
  1. 处理无效值
  • 检查 infnan
    python result = np.divide(1, np.array([0, 1])) print(np.isinf(result)) # 输出:[ True False]
  1. 优化内存
  • 使用 out 参数复用数组:
    python result = np.zeros_like(arr) np.multiply(arr, 2, out=result)
  1. 结合其他库
  • 与 Pandas 集成:
    python import pandas as pd df = pd.DataFrame(arr) df += 2 # 类似 NumPy 广播
  1. 调试形状
  • 检查数组形状:
    python print(arr1.shape, arr2.shape)

七、总结

NumPy 的算术函数(如 addsubtractmultiplydividepower)提供了高效的向量化运算,支持加、减、乘、除、幂等操作,结合广播机制可处理不同形状的数组。掌握这些函数,理解数据类型转换和广播规则,遵循最佳实践(如向量化、处理无效值、优化内存),能显著提升数据处理效率。注意除零、形状兼容性和性能优化,确保代码的正确性和高效性。

如果你需要更复杂的算术运算示例(如多维矩阵运算、性能优化)或特定场景的代码,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注