diff options
author | Matti Picus <matti.picus@gmail.com> | 2020-05-06 09:10:49 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-06 09:10:49 +0300 |
commit | 9babf6596876be7be02e823688a2b359756e27f3 (patch) | |
tree | 42265d5c714c42ef4a507f91fd0b67a3c7115417 /numpy/lib/function_base.py | |
parent | 13080b05787e1379cc30e18840ce704475b56179 (diff) | |
parent | c888073415d60e47a36cb87d72488e12107b34be (diff) | |
download | numpy-9babf6596876be7be02e823688a2b359756e27f3.tar.gz |
Merge pull request #16125 from WarrenWeckesser/vectorize-bug
BUG: lib: Fix a problem with vectorize with default parameters.
Diffstat (limited to 'numpy/lib/function_base.py')
-rw-r--r-- | numpy/lib/function_base.py | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/numpy/lib/function_base.py b/numpy/lib/function_base.py index 38acfd2d5..dea01d12d 100644 --- a/numpy/lib/function_base.py +++ b/numpy/lib/function_base.py @@ -2050,7 +2050,7 @@ class vectorize: self.pyfunc = pyfunc self.cache = cache self.signature = signature - self._ufunc = None # Caching to improve default performance + self._ufunc = {} # Caching to improve default performance if doc is None: self.__doc__ = pyfunc.__doc__ @@ -2115,14 +2115,22 @@ class vectorize: if self.otypes is not None: otypes = self.otypes - nout = len(otypes) - # Note logic here: We only *use* self._ufunc if func is self.pyfunc - # even though we set self._ufunc regardless. - if func is self.pyfunc and self._ufunc is not None: - ufunc = self._ufunc + # self._ufunc is a dictionary whose keys are the number of + # arguments (i.e. len(args)) and whose values are ufuncs created + # by frompyfunc. len(args) can be different for different calls if + # self.pyfunc has parameters with default values. We only use the + # cache when func is self.pyfunc, which occurs when the call uses + # only positional arguments and no arguments are excluded. + + nin = len(args) + nout = len(self.otypes) + if func is not self.pyfunc or nin not in self._ufunc: + ufunc = frompyfunc(func, nin, nout) else: - ufunc = self._ufunc = frompyfunc(func, len(args), nout) + ufunc = None # We'll get it from self._ufunc + if func is self.pyfunc: + ufunc = self._ufunc.setdefault(nin, ufunc) else: # Get number of outputs and output types by calling the function on # the first entries of args. We also cache the result to prevent |