def unif_resample(x,n,weights,tol=.001,deg=3): x = np.atleast_2d(x) weights = np.atleast_2d(weights) x = mu.remove_duplicate_rows(x) x_scaled = x * weights dl = mu.norms(x_scaled[1:] - x_scaled[:-1],1) l = np.cumsum(np.r_[0,dl]) (tck,_) = si.splprep(x_scaled.T,k=deg,s = tol**2*len(x),u=l) newu = np.linspace(0,l[-1],n) out_scaled = np.array(si.splev(newu,tck)).T out = out_scaled/weights return out
def unif_resample(x, n, weights, tol=.001, deg=3): x = np.atleast_2d(x) weights = np.atleast_2d(weights) x = mu.remove_duplicate_rows(x) x_scaled = x * weights dl = mu.norms(x_scaled[1:] - x_scaled[:-1], 1) l = np.cumsum(np.r_[0, dl]) (tck, _) = si.splprep(x_scaled.T, k=deg, s=tol**2 * len(x), u=l) newu = np.linspace(0, l[-1], n) out_scaled = np.array(si.splev(newu, tck)).T out = out_scaled / weights return out
def adaptive_resample2(x, tol, max_change=-1, min_steps=3): print type(x) print x.shape """ resample original signal with a small number of waypoints so that the the sparsely sampled function, when linearly interpolated, deviates from the original function by less than tol at every time input: x: 2D array in R^(t x k) where t is the number of timesteps tol: tolerance. either a single scalar or a vector of length k max_change: max change in the sparsely sampled signal at each timestep min_steps: minimum number of timesteps in the new trajectory. (usually irrelevant) output: new_times, new_x assuming that the old signal has times 0,1,2,...,len(x)-1 this gives the new times, and the new signal """ x = np.asarray(x) assert x.ndim == 2 if np.isscalar(tol): tol = np.ones(x.shape[1])*tol else: tol = np.asarray(tol) assert tol.ndim == 1 and tol.shape[0] == x.shape[1] times = np.arange(x.shape[0]) if max_change == -1: max_change = np.ones(x.shape[1]) * np.inf elif np.isscalar(max_change): max_change = np.ones(x.shape[1]) * max_change else: max_change = np.asarray(max_change) assert max_change.ndim == 1 and max_change.shape[0] == x.shape[1] dl = mu.norms(x[1:] - x[:-1],1) l = np.cumsum(np.r_[0,dl]) def bad_inds(x1, t1): ibad = np.flatnonzero( (np.abs(mu.interp2d(l, l1, x1) - x) > tol).any(axis=1) ) jbad1 = np.flatnonzero((np.abs(x1[1:] - x1[:-1]) > max_change[None,:]).any(axis=1)) if len(ibad) == 0 and len(jbad1) == 0: return [] else: lbad = l[ibad] jbad = np.unique(np.searchsorted(l1, lbad)) - 1 jbad = np.union1d(jbad, jbad1) return jbad l1 = np.linspace(0,l[-1],min_steps) for _ in xrange(20): x1 = mu.interp2d(l1, l, x) bi = bad_inds(x1, l1) if len(bi) == 0: return np.interp(l1, l, times), x1 else: l1 = np.union1d(l1, (l1[bi] + l1[bi+1]) / 2 ) raise Exception("couldn't subdivide enough. something funny is going on. check your input data")
def adaptive_resample2(x, tol, max_change=-1, min_steps=3): print type(x) print x.shape """ resample original signal with a small number of waypoints so that the the sparsely sampled function, when linearly interpolated, deviates from the original function by less than tol at every time input: x: 2D array in R^(t x k) where t is the number of timesteps tol: tolerance. either a single scalar or a vector of length k max_change: max change in the sparsely sampled signal at each timestep min_steps: minimum number of timesteps in the new trajectory. (usually irrelevant) output: new_times, new_x assuming that the old signal has times 0,1,2,...,len(x)-1 this gives the new times, and the new signal """ x = np.asarray(x) assert x.ndim == 2 if np.isscalar(tol): tol = np.ones(x.shape[1]) * tol else: tol = np.asarray(tol) assert tol.ndim == 1 and tol.shape[0] == x.shape[1] times = np.arange(x.shape[0]) if max_change == -1: max_change = np.ones(x.shape[1]) * np.inf elif np.isscalar(max_change): max_change = np.ones(x.shape[1]) * max_change else: max_change = np.asarray(max_change) assert max_change.ndim == 1 and max_change.shape[0] == x.shape[1] dl = mu.norms(x[1:] - x[:-1], 1) l = np.cumsum(np.r_[0, dl]) def bad_inds(x1, t1): ibad = np.flatnonzero( (np.abs(mu.interp2d(l, l1, x1) - x) > tol).any(axis=1)) jbad1 = np.flatnonzero( (np.abs(x1[1:] - x1[:-1]) > max_change[None, :]).any(axis=1)) if len(ibad) == 0 and len(jbad1) == 0: return [] else: lbad = l[ibad] jbad = np.unique(np.searchsorted(l1, lbad)) - 1 jbad = np.union1d(jbad, jbad1) return jbad l1 = np.linspace(0, l[-1], min_steps) for _ in xrange(20): x1 = mu.interp2d(l1, l, x) bi = bad_inds(x1, l1) if len(bi) == 0: return np.interp(l1, l, times), x1 else: l1 = np.union1d(l1, (l1[bi] + l1[bi + 1]) / 2) raise Exception( "couldn't subdivide enough. something funny is going on. check your input data" )