В этом вопросе я спросил сообщество о том, как scipy.interpolate.splev вычисляет основу сплайна. Моей целью было вычислить сплайн быстрее, чем splev, путем предварительного расчета основы bspline и сгенерируйте кривую, создав основу для контрольной точки скалярное произведение.
С тех пор появился новый scipy.interpolate.BSpline интерполятор был добавлен в scipy. Он поставляется с функцией base_element, которую, как я полагаю, можно использовать для возврата базиса, используемого для расчета сплайна.
Так, например, используя код отсюда со входными данными ниже:
import numpy as np
# Control points
cv = np.array([[ 50., 25., 0.],
[ 59., 12., 0.],
[ 50., 10., 0.],
[ 57., 2., 0.],
[ 40., 4., 0.],
[ 40., 14., 0.]])
kv = [0, 0, 0, 0, 1, 2, 3, 3, 3, 3] # knot vector
n = 10 # 10 samples (keeping it simple)
degree = 3 # Curve degree
Я могу вычислить следующую основу bspline:
[[ 1. 0. 0. 0. 0. 0. ]
[ 0.2962963 0.56481481 0.13271605 0.00617284 0. 0. ]
[ 0.03703704 0.51851852 0.39506173 0.04938272 0. 0. ]
[ 0. 0.25 0.58333333 0.16666667 0. 0. ]
[ 0. 0.07407407 0.54938272 0.36728395 0.00925926 0. ]
[ 0. 0.00925926 0.36728395 0.54938272 0.07407407 0. ]
[ 0. 0. 0.16666667 0.58333333 0.25 0. ]
[ 0. 0. 0.04938272 0.39506173 0.51851852 0.03703704]
[ 0. 0. 0.00617284 0.13271605 0.56481481 0.2962963 ]
[ 0. 0. 0. 0. 0. 1. ]]
Использование np.dot с базисом и контрольными точками возвращает 10 выборок на кривой:
[[ 50. 25. 0. ]
[ 55.12654321 15.52469136 0. ]
[ 55.01234568 11.19753086 0. ]
[ 53.41666667 9.16666667 0. ]
[ 53.14506173 7.15432099 0. ]
[ 53.1882716 5.17901235 0. ]
[ 51.58333333 3.83333333 0. ]
[ 47.20987654 3.87654321 0. ]
[ 42.31790123 6.7345679 0. ]
[ 40. 14. 0. ]]
Вопрос: можно ли извлечь основу, как описано выше, из scipy.interpolate.BSpline?
Очевидно, я использую это неправильно, потому что, когда я пытаюсь, я получаю что-то вроде этого:
from scipy.interpolate import BSpline
b = BSpline.basis_element(kv)
print b(np.linspace(kv[0],kv[-1],n)) # i'm not sure what these values represent
[ 0. 0.00256299 0.04495618 0.16555213 0.28691315 0.28691315
0.16555213 0.04495618 0.00256299 0. ]
Подробнее здесь: https://stackoverflow.com/questions/459 ... te-bspline