Spec-Zone.ru › NumPy 1.21

Многочлены

Многочлены в NumPy можно создавать, обрабатывать и даже аппроксимировать с помощью удобных классов пакета numpy.polynomial, представленного в NumPy 1.4.

До NumPy 1.4 классом по умолчанию был numpy.poly1d, и он по-прежнему доступен для обеспечения обратной совместимости. Однако, новый пакет polynomial package более полный, и его convenience classes обеспечивает более согласованный и надежный интерфейс для работы с полиномиальными выражениями. Поэтому рекомендуется использовать numpy.polynomial для нового кода.

Примечание

Терминология

Термин модуль многочленов относится к старому 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, считаются устаревшими и не должны использоваться в новом коде. С версии 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\), в экземпляр 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

Дополнительные сведения об атрибутах 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([ 1.13710724, -0.50899358])

С новым полиномиальным API предпочтительнее использовать метод класса fit:

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

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

Обратите внимание, что коэффициенты приведены в масштабированной области, определенной линейным соответствием между window и domain. convert можно использовать для получения коэффициентов в области данных без масштабирования.

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

Документация для пакета многочленов

В дополнение к стандартным многочленам степенной зависимости, пакет многочленов предоставляет несколько дополнительных типов многочленов, включая Чебышева, Эрмита (два подтипа), Лагера и Лежандра. Каждый из них имеет соответствующий convenience class, доступный из пространства имен numpy.polynomial, который обеспечивает согласованный интерфейс для работы с многочленами независимо от их типа.

  • Использование удобных классов

Документация, относящаяся к конкретным функциям, определенным для каждого типа многочлена индивидуально, доступна в соответствующей документации модуля:

  • Многочлены степенной зависимости (numpy.polynomial.polynomial)
  • Ряды Чебышева (numpy.polynomial.chebyshev)
  • Ряды Эрмита, «физики» (numpy.polynomial.hermite)
  • Ряды ЭрмитаЭ, «вероятностники» (numpy.polynomial.hermite_e)
  • Ряды Лагера (numpy.polynomial.laguerre)
  • Ряды Лежандра (numpy.polynomial.legendre)
  • Polyutils

Документация для устаревших многочленов

  • Poly1d
    • Основы
    • Аппроксимация
    • Дифференциальное и интегральное исчисление
    • Арифметика
    • Предупреждения

© 2005–2022 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.21/reference/routines.polynomials.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API