多項式#

NumPy 中的多項式可以使用 便利類別 進行建立操作,甚至擬合,這些類別來自 NumPy 1.4 中引入的 numpy.polynomial 套件。

在 NumPy 1.4 之前,numpy.poly1d 是首選的類別,並且為了保持向後相容性仍然可用。然而,較新的 polynomial 套件 更加完整,其 便利類別 為多項式表達式提供了更一致、行為更好的介面。因此,建議新的程式碼使用 numpy.polynomial

注意

術語

術語多項式模組指的是在 numpy.lib.polynomial 中定義的舊 API,其中包括 numpy.poly1d 類別以及以 poly 為前綴的多項式函數,這些函數可以從 numpy 命名空間存取(例如 numpy.polyaddnumpy.polyvalnumpy.polyfit 等)。

術語多項式套件指的是在 numpy.polynomial 中定義的新 API,其中包括用於不同種類多項式的便利類別(PolynomialChebyshev 等)。

numpy.poly1d 轉換到 numpy.polynomial#

如上所述,在 numpy.lib.polynomial 中定義的 poly1d 類別 和相關函數,例如 numpy.polyfitnumpy.poly,被認為是舊版,不應在新程式碼中使用。自 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)

轉換指南#

numpy.lib.polynomialnumpy.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 屬性之外,多項式套件中的多項式也具有 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)

使用舊版多項式模組,可以使用 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')

請注意,係數是在由 windowdomain 之間的線性映射定義的縮放域中給出的。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 介面,而與其類型無關。

有關為每種多項式個別定義的特定函數的文件,可以在對應的模組文件中找到

舊版多項式的文件#