HOWTO · NumPy

NumPy 阶乘

学习如何使用 SciPy 的 special.factorial() 函数在 Python 中计算 NumPy 数组元素的阶乘,包括代码示例和对结果的解释,包括为什么值以浮点数返回,以及如何改为请求确切的整数结果。

本页内容

计算数字的阶乘是数学和编程中的一项常见任务,尤其是在统计学和组合学等领域。在 Python 中,我们可以使用 SciPy 库中的 special.factorial() 函数来计算 NumPy 数组中元素的阶乘。

此函数在数组上逐元素执行计算。无论您处理的是少量数字还是大型数组,同样的调用都会一次性将阶乘应用于每个元素。

在本文中,我们将探讨如何使用 special.factorial() 函数,并提供清晰的示例和解释,以帮助您掌握这一基本概念。

什么是阶乘?

在深入代码之前,理解什么是阶乘至关重要。非负整数 n 的阶乘,记为 n!,是所有小于或等于 n 的正整数的乘积。例如,5! 等于 5 × 4 × 3 × 2 × 1,结果为 120。阶乘广泛用于排列、组合和其他数学计算中。

在编程中,经常需要一次性计算数组中每个元素的阶乘。这正是 NumPy 和 SciPy 发挥作用的地方:special.factorial() 在数组上逐元素应用该运算。

使用 SciPy 的 special.factorial() 函数

SciPy 库中的 special.factorial() 函数旨在计算数组中每个元素的阶乘。它逐元素执行运算,因此一次调用即可处理任何大小的数组。

要使用此函数,您首先需要安装 SciPy 库(如果尚未安装)。您可以使用 pip 来完成:

pip install scipy

安装 SciPy 后,您就可以开始使用 special.factorial() 函数。下面是一个简单的示例,演示如何计算整数数组的阶乘。

import numpy as np
from scipy import special

arr = np.array([0, 1, 2, 3, 4, 5])
factorials = special.factorial(arr)

print(factorials)

Output:

[  1.   1.   2.   6.  24. 120.]

在此示例中,我们首先导入所需的库:NumPy 和 SciPy 的 special 模块。我们创建了一个包含 0 到 5 的整数的 NumPy 数组。通过将此数组传递给 special.factorial() 函数,我们获得了这些数字的阶乘。输出显示了相应的阶乘为浮点数,这是该函数的默认行为。

为大型数组计算阶乘

同样的调用对于更大的数组也无需更改即可工作。

让我们看一个例子,我们为更大范围的数字计算阶乘。

large_arr = np.arange(10, 21)  # Array from 10 to 20
large_factorials = special.factorial(large_arr)

print(large_factorials)

Output:

[3.62880000e+06 3.99168000e+07 4.79001600e+08 6.22702080e+09
 8.71782912e+10 1.30767437e+12 2.09227899e+13 3.55687428e+14
 6.40237371e+15 1.21645100e+17 2.43290201e+18]

在这种情况下,我们使用 np.arange() 创建了一个包含 10 到 20 的整数的数组。special.factorial() 函数计算此数组中每个元素的阶乘,无需编写循环。由于数字很大,输出以科学计数法显示。

为什么结果是浮点数

再看上面的输出:阶乘以浮点数的形式返回——120. 而非 120,更大的结果则以科学计数法表示。这是 special.factorial() 的默认行为:即使每个输入都是整数,它也以浮点值返回结果。

浮点数的精度有限,因此对于非常大的阶乘,返回的值是最接近的可表示浮点数,而不是确切的整数。如果您需要确切的整数结果,请传递 exact=True:

arr = np.array([0, 1, 2, 3, 4, 5])
exact_factorials = special.factorial(arr, exact=True)

print(exact_factorials)

Output:

[  1   1   2   6  24 120]

使用 exact=True 时,相同的输入会返回没有小数点的整数,如输出所示。当浮点结果可以满足您的计算需求时,选择默认形式;当确切的整数值很重要时,选择精确形式。

结论

总之,SciPy 库中的 special.factorial() 函数在 Python 中对 NumPy 数组逐元素计算阶乘。无论您处理的是小数组还是大数组,都适用同样的调用,并且结果默认以浮点数返回,通过传递 exact=True 可获得确切的整数结果。了解如何计算阶乘不仅有助于数学计算,还为统计学和数据科学中更高级的主题打开了大门。

FAQ

  1. 一个数字的阶乘是什么?
    非负整数 n 的阶乘是所有小于或等于 n 的正整数的乘积,记为 n!。

  2. 如何安装 SciPy?
    您可以使用 pip,通过命令 pip install scipy 来安装 SciPy。

  3. 为什么结果显示为浮点数?
    默认情况下,special.factorial() 函数即使对于整数输入也返回浮点值,因此较大的结果以科学计数法打印。

  4. 如何改为获得确切的整数阶乘?
    如上面的浮点数部分所示,向 special.factorial() 函数传递 exact=True。

  5. special.factorial() 返回什么输出格式?
    输出默认以浮点数返回。