scipy.interpolate.BSpline.design_matrix#

classmethod BSpline.design_matrix(x, t, k)[source]#

Returns a design matrix as a CSR format sparse array.

Parameters
xarray_like, shape (n,)

Points to evaluate the spline at.

tarray_like, shape (nt,)

Sorted 1D array of knots.

kint

B-spline degree.

Returns
design_matrixcsr_array object

Sparse matrix in CSR format where in each row all the basis elements are evaluated at the certain point (first row - x[0], …, last row - x[-1]).

Notes

New in version 1.8.0.

In each row of the design matrix all the basis elements are evaluated at the certain point (first row - x[0], …, last row - x[-1]).

nt is a lenght of the vector of knots: as far as there are nt - k - 1 basis elements, nt should be not less than 2 * k + 2 to have at least k + 1 basis element.

Out of bounds x raises a ValueError.

Examples

Construct a design matrix for a B-spline

>>> from scipy.interpolate import make_interp_spline, BSpline
>>> x = np.linspace(0, np.pi * 2, 4)
>>> y = np.sin(x)
>>> k = 3
>>> bspl = make_interp_spline(x, y, k=k)
>>> design_matrix = bspl.design_matrix(x, bspl.t, k)
>>> design_matrix.toarray()
[[1.        , 0.        , 0.        , 0.        ],
[0.2962963 , 0.44444444, 0.22222222, 0.03703704],
[0.03703704, 0.22222222, 0.44444444, 0.2962963 ],
[0.        , 0.        , 0.        , 1.        ]]

Construct a design matrix for some vector of knots

>>> k = 2
>>> t = [-1, 0, 1, 2, 3, 4, 5, 6]
>>> x = [1, 2, 3, 4]
>>> design_matrix = BSpline.design_matrix(x, t, k).toarray()
>>> design_matrix
[[0.5, 0.5, 0. , 0. , 0. ],
[0. , 0.5, 0.5, 0. , 0. ],
[0. , 0. , 0.5, 0.5, 0. ],
[0. , 0. , 0. , 0.5, 0.5]]

This result is equivalent to the one created in the sparse format

>>> c = np.eye(len(t) - k - 1)
>>> design_matrix_gh = BSpline(t, c, k)(x)
>>> np.allclose(design_matrix, design_matrix_gh, atol=1e-14)
True