多項式#
NumPy 中的多項式可以使用 便利類別 進行建立、操作,甚至擬合,這些類別來自 NumPy 1.4 中引入的 numpy.polynomial
套件。
在 NumPy 1.4 之前,numpy.poly1d
是首選的類別,並且為了保持向後相容性仍然可用。然而,較新的 polynomial 套件
更加完整,其 便利類別 為多項式表達式提供了更一致、行為更好的介面。因此,建議新的程式碼使用 numpy.polynomial
。
注意
術語
術語多項式模組指的是在 numpy.lib.polynomial
中定義的舊 API,其中包括 numpy.poly1d
類別以及以 poly 為前綴的多項式函數,這些函數可以從 numpy
命名空間存取(例如 numpy.polyadd
、numpy.polyval
、numpy.polyfit
等)。
術語多項式套件指的是在 numpy.polynomial
中定義的新 API,其中包括用於不同種類多項式的便利類別(Polynomial
、Chebyshev
等)。
從 numpy.poly1d
轉換到 numpy.polynomial
#
如上所述,在 numpy.lib.polynomial
中定義的 poly1d 類別
和相關函數,例如 numpy.polyfit
和 numpy.poly
,被認為是舊版,不應在新程式碼中使用。自 NumPy 1.4 版本以來,建議使用 numpy.polynomial
套件來處理多項式。
快速參考#
下表重點說明了舊版多項式模組和多項式套件在常見任務中的一些主要差異。為了簡潔起見,已匯入 Polynomial
類別
from numpy.polynomial import Polynomial
如何… |
舊版 ( |
|
從係數建立多項式物件 [1] |
|
|
從根建立多項式物件 |
|
|
將 |
|
|
轉換指南#
numpy.lib.polynomial
和 numpy.polynomial
之間存在顯著差異。最顯著的差異是多項式表達式的係數排序。numpy.polynomial
中的各種常式都處理從零次項係數開始往上的級數,這與 poly1d 慣例的反向順序相反。記住這一點的簡單方法是索引對應於次數,即 coef[i]
是 i 次項的係數。
雖然慣例上的差異可能會令人困惑,但從舊版多項式 API 轉換到新的 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)
使用舊版多項式模組,可以使用 polyfit
將線性擬合(即 1 次多項式)應用於這些資料
In [4]: np.polyfit(x, y, deg=1)
Out[4]: array([ 1.05733523, -0.04871142])
使用新的多項式 API,建議使用 fit
類別方法
In [5]: p_fitted = np.polynomial.Polynomial.fit(x, y, deg=1)
In [6]: p_fitted
Out[6]: Polynomial([4.70929711, 4.75800853], domain=[0., 9.], window=[-1., 1.], symbol='x')
請注意,係數是在由 window
和 domain
之間的線性映射定義的縮放域中給出的。convert
可以用於取得未縮放資料域中的係數。
In [7]: p_fitted.convert()
Out[7]: Polynomial([-0.04871142, 1.05733523], domain=[-1., 1.], window=[-1., 1.], symbol='x')
polynomial
套件的文件#
除了標準冪級數多項式之外,多項式套件還提供了幾種額外的多項式,包括切比雪夫多項式、厄米多項式(兩種子類型)、拉蓋爾多項式和勒讓德多項式。它們各自都有一個相關的 便利類別,可以從 numpy.polynomial
命名空間取得,它們為處理多項式提供了 consistent 介面,而與其類型無關。
有關為每種多項式個別定義的特定函數的文件,可以在對應的模組文件中找到