多项式

numpy中的多项式可以是 创建 , 操纵的 甚至 装配的 使用 convenience classes 的 numpy.polynomial 包,在numpy 1.4中引入。

在numpy 1.4之前, numpy.poly1d 是选择的类,为了保持向后兼容性,它仍然可用。然而,新的 polynomial package 是更完整的 convenience classes 为使用多项式表达式提供更一致、性能更好的接口。因此 numpy.polynomial 建议用于新编码。

注解

Terminology

术语 多项式模 指中定义的旧API numpy.lib.polynomial ,其中包括 numpy.poly1d 类和带前缀的多项式函数 poly 可从 numpy 命名空间(例如。 numpy.polyadd , numpy.polyval , numpy.polyfit 等)。

术语 多项式包 指中定义的新API numpy.polynomial ,其中包括各种多项式的便利类 (numpy.polynomial.Polynomial , numpy.polynomial.Chebyshev 等)。

正在从转换 numpy.poly1d 到 numpy.polynomial

如上所述 poly1d class 以及中定义的相关函数 numpy.lib.polynomial ,如 numpy.polyfit 和 numpy.poly ,被认为是遗产,应该 not 在新代码中使用。自NumPy版本1.4以来 numpy.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)

1

注意系数的倒序

过渡导板

两者之间存在显著差异 numpy.lib.polynomial 和 numpy.polynomial . 最显著的区别是多项式表达式的系数顺序。生活中的各种例行公事 numpy.polynomial 它们都处理系数从零度向上的级数,这就是 颠倒顺序 《poly1d公约》。记住这一点的简单方法是,索引对应于度,即。, coef[i] 是度项的系数 i .

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

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

除了 coef 有多项式,也有多项式的属性 domain 和 window 属性。在将多项式拟合到数据时,这些属性是最相关的,不过应该注意的是,具有不同属性的多项式 domain 和 window 属性不相等,不能在算术中混合:

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

有关 convenience classes 有关 domain 和 window 属性。

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

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

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

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

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

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

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

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

In [6]: p_fitted
Out[6]: Polynomial([4.57466407, 4.40993348], domain=[0., 9.], window=[-1.,  1.])

请注意,系数已给出 在缩放域中 定义为 window 和 domain . convert 可以用来得到非标度数据域中的系数。

In [7]: p_fitted.convert()
Out[7]: Polynomial([0.16473059, 0.97998522], domain=[-1.,  1.], window=[-1.,  1.])

文件 polynomial 包裹

除了标准的幂级数多项式外,多项式包还提供了几种其他类型的多项式,包括切比雪夫多项式、Hermite多项式(两个子类型)、Laguerre多项式和Legendre多项式。每一个都有一个相关的 convenience class 可从 numpy.polynomial 名称空间,它提供了一个用于处理多项式(无论其类型如何)的一致接口。

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

遗留多项式文档