summaryrefslogtreecommitdiff
path: root/numpy/polynomial/hermite.py
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2016-01-18 12:09:41 -0700
committerCharles Harris <charlesr.harris@gmail.com>2016-01-19 09:40:43 -0700
commit48596210faa134149f7bd4a1a82a665e02bb8104 (patch)
tree6c7fee49a6e0ca8ec970c9dafa02d724dc3518e7 /numpy/polynomial/hermite.py
parentaa824670cf6ad21c2f921856ba4eec00781347fe (diff)
downloadnumpy-48596210faa134149f7bd4a1a82a665e02bb8104.tar.gz
MAINT: Refactor polynomial leastsquares fits.
* Rewrite the documentation for `deg`. * Check that the passed degrees are int and raise if not. * Do not accept `deg` arguments that do not convert as 0-D or 1-D. * Sort passed degree terms for repeatability.
Diffstat (limited to 'numpy/polynomial/hermite.py')
-rw-r--r--numpy/polynomial/hermite.py37
1 files changed, 16 insertions, 21 deletions
diff --git a/numpy/polynomial/hermite.py b/numpy/polynomial/hermite.py
index 5d4b357fe..e234c8e23 100644
--- a/numpy/polynomial/hermite.py
+++ b/numpy/polynomial/hermite.py
@@ -1388,14 +1388,11 @@ def hermfit(x, y, deg, rcond=None, full=False, w=None):
y-coordinates of the sample points. Several data sets of sample
points sharing the same x-coordinates can be fitted at once by
passing in a 2D-array that contains one dataset per column.
- deg : int or array_like
- Degree of the fitting polynomial. If `deg` is a single integer
- all terms up to and including the `deg`'th term are included.
- `deg` may alternatively be a list or array specifying which
- terms in the Legendre expansion to include in the fit.
-
- .. versionchanged:: 1.11.0
- `deg` may be a list specifying which terms to fit
+ deg : int or 1-D array_like
+ Degree(s) of the fitting polynomials. If `deg` is a single integer
+ all terms up to and including the `deg`'th term are included in the
+ fit. For Numpy versions >= 1.11 a list of integers specifying the
+ degrees of the terms to include may be used instead.
rcond : float, optional
Relative condition number of the fit. Singular values smaller than
this relative to the largest singular value will be ignored. The
@@ -1494,11 +1491,11 @@ def hermfit(x, y, deg, rcond=None, full=False, w=None):
"""
x = np.asarray(x) + 0.0
y = np.asarray(y) + 0.0
- deg = np.asarray([deg,], dtype=int).flatten()
+ deg = np.asarray(deg)
# check arguments.
- if deg.size < 1:
- raise TypeError("expected deg to be one or more integers")
+ if deg.ndim > 1 or deg.dtype.kind not in 'iu' or deg.size == 0:
+ raise TypeError("deg must be an int or non-empty 1-D array of int")
if deg.min() < 0:
raise ValueError("expected deg >= 0")
if x.ndim != 1:
@@ -1510,19 +1507,17 @@ def hermfit(x, y, deg, rcond=None, full=False, w=None):
if len(x) != len(y):
raise TypeError("expected x and y to have same length")
- if deg.size == 1:
- restricted_fit = False
- lmax = deg[0]
+ if deg.ndim == 0:
+ lmax = deg
order = lmax + 1
+ van = hermvander(x, lmax)
else:
- restricted_fit = True
- lmax = deg.max()
- order = deg.size
+ deg = np.sort(deg)
+ lmax = deg[-1]
+ order = len(deg)
+ van = hermvander(x, lmax)[:, deg]
# set up the least squares matrices in transposed form
- van = hermvander(x, lmax)
- if restricted_fit:
- van = van[:, deg]
lhs = van.T
rhs = y.T
if w is not None:
@@ -1552,7 +1547,7 @@ def hermfit(x, y, deg, rcond=None, full=False, w=None):
c = (c.T/scl).T
# Expand c to include non-fitted coefficients which are set to zero
- if restricted_fit:
+ if deg.ndim > 0:
if c.ndim == 2:
cc = np.zeros((lmax+1, c.shape[1]), dtype=c.dtype)
else: