NumPy ufunc - Python 的通用函数

2024 年 8 月 29 日 | 阅读 6 分钟

NumPy,是“Numerical Python”的缩写,是 Python 中进行数值计算和科学计算的基础库之一。它最强大的功能之一就是通用函数(Universal Functions),通常简称为“ufuncs”。NumPy 中的 ufuncs 允许对数组进行高效的逐元素(element-wise)操作,使其成为 Python 中数据处理和数学计算的基石。在本文中,我们将深入探讨 ufuncs 是什么,它们如何工作,并探讨一些实际用例。

什么是 NumPy 通用函数(ufuncs)?

在 NumPy 中,通用函数(ufunc)是一种灵活的应用函数于数组(或标量)的元素,独立地、逐个元素地处理的方式。Ufuncs 可以处理不同形状的数组,并通过广播(broadcasting)机制确保操作被有效地、以内存友好的方式执行。Ufuncs 是 NumPy 的一个关键特性,因为它们实现了矢量化操作,这比使用显式循环快得多,也更简洁。

ufunc 的语法

NumPy 中的 ufuncs 通常看起来像普通的 Python 函数,但它们是为数组实现的。语法通常包括:

  • ufunc:这是你想要使用的特定 ufunc 的占位符(例如:numpy.add, numpy.subtract, numpy.multiply 等)。
  • 输入:ufunc 将在其上操作的数组或标量。
  • *args**kwargs:可能为特定 ufuncs 所需的附加参数和关键字参数。

ufuncs 如何工作?

Ufuncs 通过对数组执行逐元素操作来工作。当你将一个 ufunc 应用于一个数组时,它会单独地处理数组的每个元素,并产生一个新的结果数组。关键优势在于,这个操作是在编译过的 C 代码中执行的,这使得 ufuncs 比使用 Python 循环执行的相同操作快得多。

下面是一个简单的例子

输入

输出

[ 8  6 10  3]

在这种情况下,**np.add** ufunc 用于将 arr1 和 arr2 的对应元素相加。操作是逐个元素完成的,从而生成一个新的数组。

实际用例

  • 数学运算

Ufuncs 通常用于对数组执行数学运算,包括加法、减法、乘法、除法、幂运算等。这些运算是逐个元素的,非常适合科学和数学计算。

  • NumPy 加法

输入

输出

[1.41421356 2.82842712 2.44948974 2.        ]
  • NumPy 差值

离散差值是指计算两个连续元素之间的差值。

例如:对于 [1, 2, 3, 4],离散差值将是 [2-1, 3-2, 4-3] = [1, 1, 1]

要查找离散差值,请使用 diff() 函数。

输入

输出

[  5   5 -25]

输入

输出

[  0 -30]
  • NumPy 乘积

要计算数组中元素的乘积,请使用 prod() 函数。

输入

输出

64
  • 两个数组元素的乘积

输入

输出

2822400

三角函数

NumPy 的 ufuncs 包含多种三角函数,如 **sin, cos, tan** 及其反函数,这在科学和工程应用中非常有用。

输入

输出

[0.         0.70710678 1.        ]

输入

输出

[0.10033535 0.20273255 0.54930614]

广播

Ufuncs 在广播(broadcasting)中也起着至关重要的作用,它允许 NumPy 有效地处理不同形状的数组。广播会将较小的数组扩展以匹配较大数组的形状,从而无需创建数据副本即可执行逐元素操作。

输入

输出

[[80 60 50]
 [20 40 30]]

GCD(最大公约数)

GCD(Greatest Common Denominator),也称为 HCF(Highest Common Factor),是指能同时整除两个或多个整数的最大整数。

输入

输出

6

数组中的 GCD

要查找数组中所有值的最大公约数,可以使用 reduce() 方法。

reduce() 方法将使用 ufunc(在本例中为 gcd() 函数)对每个元素进行操作,并将数组的尺寸减一。

输入

输出

5

LCM(最小公倍数)

LCM(Least Common Multiple)是指能同时被两个或多个整数整除的最小整数。

输入

输出

10

数组中的 LCM

要查找数组中所有值的最小公倍数,可以使用 reduce() 方法。

reduce() 方法将使用 ufunc(在本例中为 lcm() 函数)对每个元素进行操作,并将数组的尺寸减一。

输入

输出

24

包含 3 到 15 所有整数的数组所有值的 LCM

输入

输出

360360

NumPy 通用函数(ufuncs)是 NumPy 库的基本组成部分,它们提供了多种优势,并在科学计算、数据分析等领域有广泛的应用。以下是 NumPy ufuncs 在 Python 中的一些主要优点和应用:

NumPy Ufuncs 的优势

  1. 一致性:Ufuncs 为各种数学和逻辑运算提供了统一的接口,使代码更具可预测性且易于维护。
  2. 跨平台兼容性:NumPy 在科学计算和数据分析中得到广泛应用,ufuncs 确保操作在不同平台和硬件上的一致性。
  3. 广播:Ufuncs 支持广播,这是一项强大的功能,可以有效地处理不同形状的数组。广播可以消除创建数据副本的需求,从而减少内存使用。
  4. 效率:Ufuncs 是用高度优化的 C 代码实现的,因此比使用 Python 循环执行的等效操作要快得多。在大数据集或进行复杂的数学计算时,这种效率至关重要。
  5. 逐元素操作:Ufuncs 允许你对数组执行逐元素操作。这简化了代码并使其更易读,因为你不必编写显式循环。

NumPy Ufuncs 的应用

  1. 数据分析:Ufuncs 在数据分析任务中非常宝贵,例如数据的清理、转换、聚合和摘要。它们简化了对大型数据集的操作,使得数据分析更可行。
  2. 统计分析:NumPy ufuncs 在统计分析中发挥着至关重要的作用。你可以使用 ufuncs 来高效地计算大量数据集的平均值、中位数、标准差和相关性等统计量。
  3. 物理模拟:Ufuncs 用于物理系统的模拟,包括流体动力学、热传递和量子力学的模拟。这些模拟可以高效地解决复杂的数学方程。
  4. 图像处理:Ufuncs 应用于图像的像素值,以执行各种图像处理操作,如滤波、调整大小和增强。OpenCV 等库经常使用 NumPy ufuncs 进行图像处理。
  5. 机器学习:NumPy 及其 ufuncs 是 Python 中许多机器学习库和框架的基础。它们实现了训练和推理机器学习模型所需的有效矩阵和张量运算。
  6. 数学计算:Ufuncs 主要用于基本的数学运算,包括加法、减法、乘法、除法、幂运算、对数等。这些运算在科学和工程应用中至关重要。
  7. 信号处理:在信号处理应用中,ufuncs 用于滤波、卷积和傅里叶变换等任务。它们有助于处理和分析信号,在音频处理和电信等领域非常有用。