多项式#

在 NumPy 中,多项式可以通过 numpy.polynomial 包中的 便捷类 进行 创建操作 ,甚至 拟合 ,这些类在 NumPy 1.4 中引入.

在 NumPy 1.4 之前,`numpy.poly1d` 是首选的类,并且为了保持向后兼容性,它仍然可用.然而,更新的 polynomial 更完整,其 便捷类 为处理多项式表达式提供了更一致、更好用的接口.因此,建议在新代码中使用 numpy.polynomial.

备注

Terminology

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

术语 polynomial package 指的是在 numpy.polynomial 中定义的新 API,其中包括不同类型多项式的便捷类(Polynomial, Chebyshev 等).

numpy.poly1d 过渡到 numpy.polynomial#

如上所述,:class:poly1d 及其在 numpy.lib.polynomial 中定义的相关函数,例如 numpy.polyfitnumpy.poly,被认为是遗留的,不应在新代码中使用.自 NumPy 版本 1.4 以来,`numpy.polynomial` 包是处理多项式的首选.

快速参考#

下表突出了旧版多项式模块和多项式包在常见任务之间的一些主要区别.为了简洁起见,导入了 Polynomial 类:

from numpy.polynomial import Polynomial

How to…

遗留的 (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.polynomialnumpy.polynomial 之间存在显著差异.最显著的差异是多项式表达式的系数顺序.`numpy.polynomial` 中的各种例程都处理系数从零度向上的序列,这与 poly1d 约定中的*反向顺序*相对应.记住这一点的一个简单方法是索引对应于度数,即 coef[i] 是度数为 i 的项的系数.

尽管约定的差异可能会让人困惑,但从旧版多项式API转换到新版是直接的.例如,以下演示了如何将表示表达式 \(x^{2} + 2x + 3\)numpy.poly1d 实例转换为表示相同表达式的 Polynomial 实例:

>>> import numpy as np
>>> 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.93760338, 0.25991496])

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

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

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

请注意,系数是根据 windowdomain 之间的线性映射定义的 缩放域 给出的.可以使用 convert 获取未缩放数据域中的系数.

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

polynomial 包的文档#

除了标准的幂级数多项式外,多项式包还提供了几种额外的多项式类型,包括切比雪夫多项式、埃尔米特多项式(两种子类型)、拉盖尔多项式和勒让德多项式.每种多项式都有一个相关的 便捷类 ,可以从 numpy.polynomial 命名空间中获得,提供了一致的接口来处理不同类型的多项式.

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

遗留多项式的文档#