коэффициенты интерполяции сплайна в scipy

Я хочу рассчитать коэффициенты интерполяции сплайна scipy. В MATLAB:

x=[0:3]; y=[0,1,4,0]; spl=spline(x,y); disp(spl.coefs); 

и он вернется:

 ans = -1.5000 5.5000 -3.0000 0 -1.5000 1.0000 3.5000 1.0000 -1.5000 -3.5000 1.0000 4.0000 

Но я не могу этого сделать, используя interolate.splrep в scipy. Можете ли вы рассказать мне, как рассчитать его?

3 Solutions collect form web for “коэффициенты интерполяции сплайна в scipy”

Я не уверен, что есть какой-либо способ получить именно эти коэффициенты от scipy. Что дает scipy.interpolate.splrep , это коэффициенты для узлов для b-сплайна. То, что дает сплайн Matlab, похоже, является частичным полиномиальным коэффициентом, описывающим кубические уравнения, соединяющие точки, в которые вы проходите, что заставляет меня думать, что сплайн Matlab – это сплав на основе контрольной точки, такой как Hermite или Catmull-Rom вместо б-сплайн.

Однако scipy.interpolate.interpolate.spltopp действительно обеспечивает способ получения парциальных полиномиальных коэффициентов b-сплайна. К сожалению, это не работает очень хорошо.

 >>> import scipy.interpolate >>> x = [0, 1, 2, 3] >>> y = [0, 1, 4, 0] >>> tck = scipy.interpolate.splrep(x, y) >>> tck Out: (array([ 0., 0., 0., 0., 3., 3., 3., 3.]), array([ 3.19142761e-16, -3.00000000e+00, 1.05000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]), 3) >>> pp = scipy.interpolate.interpolate.spltopp(tck[0][1:-1], tck[1], tck[2]) >>> pp.coeffs.T Out: array([[ -4.54540394e-322, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [ -4.54540394e-322, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [ -4.54540394e-322, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000]]) 

Обратите внимание, что для каждого узла есть один набор коэффициентов, а не один для каждой из исходных точек. Кроме того, умножение коэффициентов на базисную матрицу b-сплайна не представляется очень полезным.

 >>> bsbm = array([[-1, 3, -3, 1], [ 3, -6, 3, 0], [-3, 0, 3, 0], [ 1, 4, 1, 0]]) * 1.0/6 Out: array([[-0.16666667, 0.5 , -0.5 , 0.16666667], [ 0.5 , -1. , 0.5 , 0. ], [-0.5 , 0. , 0.5 , 0. ], [ 0.16666667, 0.66666667, 0.16666667, 0. ]]) >>> dot(pp.coeffs.T, bsbm) Out: array([[ 7.41098469e-323, -2.27270197e-322, 2.27270197e-322, -7.41098469e-323], [ 7.41098469e-323, -2.27270197e-322, 2.27270197e-322, -7.41098469e-323], [ 7.41098469e-323, -2.27270197e-322, 2.27270197e-322, -7.41098469e-323], [ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000]]) 

Пакет Polytenomial Package FORTRAN, PPPack , имеет команду bsplpp которая преобразует из B-сплайна в кусочно-полиномиальную форму, которая может служить вашим потребностям. К сожалению, в настоящее время на PPPack нет оболочки Python.

Документы на scipy.interpolate.splrep говорят, что вы можете получить коэффициенты:

 Returns: tck : tuple (t,c,k) a tuple containing the vector of knots, the B-spline coefficients, and the degree of the spline. 

Вот как я могу получить результаты, похожие на MATLAB:

 >>> from scipy.interpolate import PPoly, splrep >>> x = [0, 1, 2, 3] >>> y = [0, 1, 4, 0] >>> tck = splrep(x, y) >>> tck Out: (array([ 0., 0., 0., 0., 3., 3., 3., 3.]), array([ 3.19142761e-16, -3.00000000e+00, 1.05000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]), 3) >>> pp = PPoly.from_spline(tck) >>> pp.cT Out: array([[ -1.50000000e+00, 5.50000000e+00, -3.00000000e+00, 3.19142761e-16], [ -1.50000000e+00, 5.50000000e+00, -3.00000000e+00, 3.19142761e-16], [ -1.50000000e+00, 5.50000000e+00, -3.00000000e+00, 3.19142761e-16], [ -1.50000000e+00, 5.50000000e+00, -3.00000000e+00, 3.19142761e-16], [ -1.50000000e+00, -8.00000000e+00, -1.05000000e+01, 0.00000000e+00], [ -1.50000000e+00, -8.00000000e+00, -1.05000000e+01, 0.00000000e+00], [ -1.50000000e+00, -8.00000000e+00, -1.05000000e+01, 0.00000000e+00]]) 
  • Ошибка при тестировании SciPy
  • Вычисление градиента с помощью NumPy
  • Как обнаружить сдвиг между изображениями
  • диагональная матрица матрицы с numpy и scipy
  • Как заставить большие шаги выполнять функции scipy.optimize?
  • Numpy: Разница между точками (a, b) и (a * b) .sum ()
  • Почему dir не показывает все атрибуты объекта Python?
  • Периодограмма в Octave / Matlab vs Scipy
  •  
    Interesting Posts for Van-Lav

    Почему Python не обнаруживает ошибки перед выполнением?

    Алгоритм случайного генерирования целочисленных разделов определенной длины в Python?

    Python – как определить, когда пользователь закрывает консольное приложение с помощью кнопки «X»

    Удаление элемента из списка

    Чтение из файла с использованием pickle и для цикла в python

    Есть ли спецификация языка Python?

    Сортировка набора QuerySet Django с помощью свойства (а не поля) модели

    Предупреждения об отказе от Django 1.9 app_label

    Ошибка при развертывании приложения python для конечных точек Google в локальном приложении с SDK приложения Engine

    Управление процессами Windows 7 / Vista – как запустить внешнюю программу после длительного простоя?

    ReportLab: Как выровнять текстовый объект?

    В чем разница между «while 1» и «while True»?

    parsing xml, содержащий пространство имен по умолчанию, чтобы получить значение элемента, используя lxml

    Ускорение загрузчика python «import»

    Сортировка словаря словарей по нескольким значениям дочернего словаря

    Python - лучший язык программирования в мире.