scipy.pi、numpy.pi和math.pi之间有什么区别吗?

171
在使用SciPy和NumPy的项目中,何时应该使用scipy.pi,何时应该使用numpy.pi,还是只使用math.pi?这些值之间有什么区别吗?

7
不,所有这些模块都提供同样的常量这一事实告诉我其中一定有原因。 - Douglas B. Staple
4
因为你并不总是使用它们所有的功能,你也不想只为了获取 Pi 而安装和导入一个模块。 - Lev Levitsky
17
@LevLevitsky 我刚开始使用Python,发现math.exp和numpy.exp有所不同(numpy.exp可以接受列表,但math.exp需要浮点数)。因此,我认为这不是一个愚蠢的问题... - Douglas B. Staple
3个回答

245
>>> import math
>>> import numpy as np
>>> import scipy
>>> math.pi == np.pi == scipy.pi
True

所以无所谓,它们都是相同的值。
三个模块都提供一个pi值的唯一原因是,如果你只使用其中一个模块,你可以方便地访问pi而不必导入另一个模块。它们并不提供不同的pi值。

20
其他条件相同的情况下,如果模块不依赖于numpy或者scipy,我会使用math.pi,因为它在标准库中。但正如你所说,无论哪个模块导入都可以使用pi,因为它们的值都是相同的。 - mgilson
6
如果你已经在使用numpy,可以使用np.pi,但仅为了获取pi而导入NumPy是没有意义的,因为它已经在math中了。 - asmeurer

50

需要注意的是,并非所有的程序库都使用相同的pi表示方法,因此了解你正在使用的表达方式是有好处的。例如,符号数学库Sympy中pi的表示法与math和numpy不同:

import math
import numpy
import scipy
import sympy

print(math.pi == numpy.pi)
> True
print(math.pi == scipy.pi)
> True
print(math.pi == sympy.pi)
> False

9
sympy中的Pi不是存储为常量/浮点数,而是一个包含该常量的对象。 - Naib
28
sympy的输出结果是符号形式的圆周率,适用于进行符号数学运算。其他输出结果则为浮点数近似值,适用于进行浮点数运算。 - endolith
3
math.pi == float(sympy.pi) 返回 True - Muhammad Yasirroni

5
如果我们查看它的源代码scipy.pi恰好等于math.pi;事实上,它被定义为:
import math as _math
pi = _math.pi

在它们的源代码中,math.pi定义为等于 3.14159265358979323846,而 numpy.pi定义为等于 3.141592653589793238462643383279502884;两者都远高于 Python 中浮点数的 15 位精度,因此使用哪个都无所谓。
话虽如此,如果您还没有使用 numpy 或 scipy,仅为了使用 np.piscipy.pi 而导入它们将增加不必要的依赖关系,而 math 是 Python 标准库,因此不存在依赖问题。例如,在 Python 的 tensorflow 代码中使用 pi,可以使用 tf.constant(math.pi)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接