summaryrefslogtreecommitdiff
path: root/numpy/lib/function_base.py
diff options
context:
space:
mode:
authorEric Wieser <wieser.eric@gmail.com>2017-07-13 12:40:05 +0100
committerEric Wieser <wieser.eric@gmail.com>2017-07-13 13:02:50 +0100
commitd86e3fee3c9906ce0fad36520de86d9ac306cee8 (patch)
treeb121dc7bae4ba36eb7cd67722e4af67d71c6f18f /numpy/lib/function_base.py
parent14ff219a13e194c5e7995218fea3c7648eb1c875 (diff)
downloadpython-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.py18
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)