多项式#

NumPy 中的多项式可以使用NumPy 1.4 中引入的包 的便利类来创建操作甚至拟合。numpy.polynomial

在 NumPy 1.4 之前,它numpy.poly1d是首选类,为了保持向后兼容性,它仍然可用。然而,较新的版本更加完整,并且它的便利类为处理多项式表达式提供了更加一致、性能更好的接口。因此建议进行新编码。polynomial packagenumpy.polynomial

笔记

术语

术语“多项式模块”指的是 中定义的旧 API numpy.lib.polynomial,其中包括可从命名空间访问的类和以polynumpy.poly1d为前缀的多项式函数 (例如、、等)。numpynumpy.polyaddnumpy.polyvalnumpy.polyfit

术语多项式包是指 中定义的新 API ,其中包括不同类型多项式( 、 等)numpy.polynomial的便利类。numpy.polynomial.Polynomialnumpy.polynomial.Chebyshev

从 过渡numpy.poly1d#numpy.polynomial

如上所述,中定义的 和 相关函数(例如 和)被视为遗留函数,不应新代码中使用。从 NumPy 版本 1.4 开始,该包是处理多项式的首选。poly1d classnumpy.lib.polynomialnumpy.polyfitnumpy.polynumpy.polynomial

快速参考

下表重点介绍了旧多项式模块和常见任务多项式包之间的一些主要差异。Polynomial为了简洁起见,导入该类:

from numpy.polynomial import Polynomial

如何…

遗产 (numpy.poly1d

numpy.polynomial

从系数创建多项式对象[ 1 ]

p = np.poly1d([1, 2, 3])

p = Polynomial([3, 2, 1])

从根创建多项式对象

r = np.poly([-1, 1]) p = np.poly1d(r)

p = Polynomial.fromroots([-1, 1])

将多项式拟合deg到数据

np.polyfit(x, y, deg)

Polynomial.fit(x, y, deg)

过渡指南#

numpy.lib.polynomial和 之间存在显着差异numpy.polynomial。最显着的区别是多项式表达式系数的排序。各种例程numpy.polynomial都处理系数从零向上的级数,这与poly1d 约定相反。记住这一点的简单方法是,索引对应于度,即,是度icoef[i]项的系数。

尽管约定上的差异可能令人困惑,但从旧多项式 API 转换为新多项式 API 是很简单的。例如,下面演示了如何转换numpy.poly1d 表示表达式的实例\(x^{2} + 2x + 3\)Polynomial代表相同表达式的实例:

>>> p1d = np.poly1d([1, 2, 3])
>>> p = np.polynomial.Polynomial(p1d.coef[::-1])

除了coef属性之外,多项式包中的多项式还具有domainwindow属性。这些属性在将多项式拟合到数据时最相关,但应该注意的是,具有不同domainwindow属性的多项式不被认为是相等的,并且不能在算术中混合:

>>> p1 = np.polynomial.Polynomial([1, 2, 3])
>>> p1
Polynomial([1., 2., 3.], domain=[-1,  1], window=[-1,  1], symbol='x')
>>> p2 = np.polynomial.Polynomial([1, 2, 3], domain=[-2, 2])
>>> p1 == p2
False
>>> p1 + p2
Traceback (most recent call last):
    ...
TypeError: Domains differ

有关和属性的更多详细信息,请参阅便利类的文档 。domainwindow

传统多项式模块和多项式包之间的另一个主要区别是多项式拟合。在旧模块中,拟合是通过该polyfit函数完成的。在多项式包中, fit类方法是首选。例如,考虑对以下数据进行简单的线性拟合:

In [1]: rng = np.random.default_rng()

In [2]: x = np.arange(10)

In [3]: y = np.arange(10) + rng.standard_normal(10)

使用旧多项式模块,可以将线性拟合(即 1 次多项式)应用于这些数据polyfit

In [4]: np.polyfit(x, y, deg=1)
Out[4]: array([0.89217112, 0.20829838])

使用新的多项式 API,fit 首选类方法:

In [5]: p_fitted = np.polynomial.Polynomial.fit(x, y, deg=1)

In [6]: p_fitted
Out[6]: Polynomial([4.22306843, 4.01477004], domain=[0., 9.], window=[-1.,  1.], symbol='x')

请注意,系数是在由和之间的线性映射定义的缩放域中给出的。 可用于获取未缩放数据域中的系数。windowdomainconvert

In [7]: p_fitted.convert()
Out[7]: Polynomial([0.20829838, 0.89217112], domain=[-1.,  1.], window=[-1.,  1.], symbol='x')

polynomial包的文档#

除了标准幂级数多项式之外,多项式包还提供了几种附加类型的多项式,包括 Chebyshev、Hermite(两种子类型)、Laguerre 和 Legendre 多项式。其中每一个都有一个 可从命名空间获取的 关联便利类numpy.polynomial,该类提供了用于处理多项式(无论其类型如何)的一致接口。

与为每种多项式单独定义的特定函数相关的文档可以在相应的模块文档中找到:

旧多项式的文档#