diff options
author | Eric Wieser <wieser.eric@gmail.com> | 2017-07-13 12:40:05 +0100 |
---|---|---|
committer | Eric Wieser <wieser.eric@gmail.com> | 2017-07-13 13:02:50 +0100 |
commit | d86e3fee3c9906ce0fad36520de86d9ac306cee8 (patch) | |
tree | b121dc7bae4ba36eb7cd67722e4af67d71c6f18f /numpy/lib/function_base.py | |
parent | 14ff219a13e194c5e7995218fea3c7648eb1c875 (diff) | |
download | python-numpy-d86e3fee3c9906ce0fad36520de86d9ac306cee8.tar.gz python-numpy-d86e3fee3c9906ce0fad36520de86d9ac306cee8.tar.bz2 python-numpy-d86e3fee3c9906ce0fad36520de86d9ac306cee8.zip |
BUG: Allow 0d arrays instead of scalars in gradient
This fixes gh-8292
Diffstat (limited to 'numpy/lib/function_base.py')
-rw-r--r-- | numpy/lib/function_base.py | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/numpy/lib/function_base.py b/numpy/lib/function_base.py index 8ee6a54dd..989030e03 100644 --- a/numpy/lib/function_base.py +++ b/numpy/lib/function_base.py @@ -1674,6 +1674,7 @@ def gradient(f, *varargs, **kwargs): S0025-5718-1988-0935077-0/S0025-5718-1988-0935077-0.pdf>`_. """ f = np.asanyarray(f) + varargs = [asanyarray(d) for d in varargs] N = f.ndim # number of dimensions axes = kwargs.pop('axis', None) @@ -1685,11 +1686,16 @@ def gradient(f, *varargs, **kwargs): len_axes = len(axes) n = len(varargs) if n == 0: - dx = [1.0] * len_axes - elif n == len_axes or (n == 1 and np.isscalar(varargs[0])): - dx = list(varargs) + # no spacing argument - use 1 in all axes + dx = [np.array(1.0)] * len_axes + elif n == 1 and varargs[0].ndim == 0: + # single scalar for all axes + dx = varargs * len_axes + elif n == len_axes: + # scalar or 1d array for each axis + dx = varargs[:] for i, distances in enumerate(dx): - if np.isscalar(distances): + if distances.ndim == 0: continue if len(distances) != f.shape[axes[i]]: raise ValueError("distances must be either scalars or match " @@ -1700,8 +1706,6 @@ def gradient(f, *varargs, **kwargs): if (diffx == diffx[0]).all(): diffx = diffx[0] dx[i] = diffx - if len(dx) == 1: - dx *= len_axes else: raise TypeError("invalid number of arguments") @@ -1751,7 +1755,7 @@ def gradient(f, *varargs, **kwargs): # result allocation out = np.empty_like(y, dtype=otype) - uniform_spacing = np.isscalar(dx[i]) + uniform_spacing = dx[i].ndim == 0 # Numerical differentiation: 2nd order interior slice1[axis] = slice(1, -1) |