多项式#
在 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.polyfit
和 numpy.poly
,被认为是遗留的,不应在新代码中使用.自 NumPy 版本 1.4 以来,`numpy.polynomial` 包是处理多项式的首选.
快速参考#
下表突出了旧版多项式模块和多项式包在常见任务之间的一些主要区别.为了简洁起见,导入了 Polynomial
类:
from numpy.polynomial import Polynomial
How to… |
遗留的 ( |
|
从系数 [1] 创建一个多项式对象 |
|
|
从根创建一个多项式对象 |
|
|
将一个次数为 |
|
|
过渡指南#
numpy.lib.polynomial
和 numpy.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
属性外,多项式包中的多项式还具有domain
和window
属性.这些属性在将多项式拟合到数据时最为相关,不过需要注意的是,具有不同domain
和window
属性的多项式不被视为相等,并且在算术中不能混合使用:>>> 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
有关 domain
和 window
属性的更多详细信息,请参阅 便捷类 的文档.
旧的多项式模块和多项式包之间的另一个主要区别是多项式拟合.在旧模块中,拟合是通过 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')
请注意,系数是根据 window
和 domain
之间的线性映射定义的 缩放域 给出的.可以使用 convert
获取未缩放数据域中的系数.
In [7]: p_fitted.convert()
Out[7]: Polynomial([0.25991496, 0.93760338], domain=[-1., 1.], window=[-1., 1.], symbol='x')
polynomial
包的文档#
除了标准的幂级数多项式外,多项式包还提供了几种额外的多项式类型,包括切比雪夫多项式、埃尔米特多项式(两种子类型)、拉盖尔多项式和勒让德多项式.每种多项式都有一个相关的 便捷类 ,可以从 numpy.polynomial
命名空间中获得,提供了一致的接口来处理不同类型的多项式.
关于为每种多项式单独定义的特定函数的文档可以在相应的模块文档中找到: