def set_values(self, values, points = None, dimension = None):
"""Calcualte the bspline parameter for the data points y
Arguments:
values (array): values of data points
points (array or None): sample points for the data values, if None use internal points or linspace(0,1,values.shape[0])
dimension (int, list or None): the dimension(s) at which to change the curve, if None change dimension to values.shape[0]
"""
values = np.array(values, dtype = float);
if values.ndim == 1:
values = values[:,np.newaxis];
vdims = range(values.shape[1]);
# determine the dimensions at which to change curve
if dimension is None:
pdims = range(values.shape[1]);
self.ndim = values.shape[1];
else:
pdims = np.array(dimension, dtype = int);
if len(vdims) != len(pdims) or len(pdims) != values.shape[1] or max(pdims) > self.ndim:
raise RuntimeError('inconsistent number of dimensions %d, values %d and parameter %d and curve %d' % (values.shape[1], len(vdims), len(pdims), self.ndim));
#set points
if points is None:
if self._points is None:
self.set_points(values.shape[0]);
else:
self.set_points(points);
if values.shape[0] != self._points.shape[0]:
raise ValueError('number of values %d mismatch number of points %d' % (values.shape[0], self._points.shape[0]));
#set parameter from values
if self.with_projection and self.projection_inverse is not False:
self._parameter[:,pdims] = self._projection_inverse.dot(values);
#self._values[:,pdims] = values;
else:
#tck,u = splprep(values, u = self.points, t = self.knots, task = -1, k = self.degree, s = 0); # splprep crashes due to erros in fitpack
#for d in range(self.ndim):
# self.parameter[d] = tck[1][d];
# self.values[d] = self.basis.dot(self.parameter[d]);
for v,p in zip(vdims, pdims):
tck = splrep(self.points, values[:,v], t = self.knots, task = -1, k = self.degree);
self.parameter[:,p] = tck[1][:self.nparameter];
# values will change
self._values = None;
#self._values = values; #fast but imprecise as values of spline due approximation might differ!
评论列表
文章目录