Re: Do special functions need to have all kwargs/attributes/methods of ufuncs?

Robert Kern <[email protected]> Tue, 19 Sep 2023 12:28:45 -0400
Newsgroups gmane.comp.python.scientific.devel
Message-ID <CAF6FJity9mRhbUK9wDci4Pm2gc+c6CPKJG6QU4=bdhR_yCz+OA@mail.gmail.com>
On Tue, Sep 19, 2023 at 12:00 PM Matt Haberland <[email protected]>
wrote:

> Yes, the documentation mentions that they are "technically" ufuncs. My
> comment was about documentation of the features of ufuncs - the
> documentation seems to intentionally hide all ufunc parameters from the
> signature. Please see
> https://github.com/scipy/scipy/pull/19023#issuecomment-1711949107
> for further context.
>

More out of concision and deduplication than anything else because those
parameters are documented in `ufunc` itself.

```
|2> special.ndtr?
Call signature:  special.ndtr(*args, **kwargs)
Type:            ufunc
String form:     <ufunc 'ndtr'>
File:
 ~/.edm/envs/py38/lib/python3.8/site-packages/numpy/__init__.py
Docstring:
ndtr(x, /, out=None, *, where=True, casting='same_kind', order='K',
dtype=None, subok=True[, signature, extobj])

ndtr(x)

Gaussian cumulative distribution function.

Returns the area under the standard Gaussian probability
density function, integrated from minus infinity to `x`

.. math::

   \frac{1}{\sqrt{2\pi}} \int_{-\infty}^x \exp(-t^2/2) dt

Parameters
----------
x : array_like, real or complex
    Argument

Returns
-------
ndarray
    The value of the normal CDF evaluated at `x`

See Also
--------
erf
erfc
scipy.stats.norm
log_ndtr
Class docstring:
Functions that operate element by element on whole arrays.

To see the documentation for a specific ufunc, use `info`.  For
example, ``np.info(np.sin)``.  Because ufuncs are written in C
(for speed) and linked into Python with NumPy's ufunc facility,
Python's help() function finds this page whenever help() is called
on a ufunc.

A detailed explanation of ufuncs can be found in the docs for :ref:`ufuncs`.

**Calling ufuncs:** ``op(*x[, out], where=True, **kwargs)``

Apply `op` to the arguments `*x` elementwise, broadcasting the arguments.

The broadcasting rules are:

* Dimensions of length 1 may be prepended to either array.
* Arrays may be repeated along dimensions of length 1.

Parameters
----------
*x : array_like
    Input arrays.
out : ndarray, None, or tuple of ndarray and None, optional
    Alternate array object(s) in which to put the result; if provided, it
    must have a shape that the inputs broadcast to. A tuple of arrays
    (possible only as a keyword argument) must have length equal to the
    number of outputs; use None for uninitialized outputs to be
    allocated by the ufunc.
where : array_like, optional
    This condition is broadcast over the input. At locations where the
    condition is True, the `out` array will be set to the ufunc result.
    Elsewhere, the `out` array will retain its original value.
    Note that if an uninitialized `out` array is created via the default
    ``out=None``, locations within it where the condition is False will
    remain uninitialized.
**kwargs
    For other keyword-only arguments, see the :ref:`ufunc docs
<ufuncs.kwargs>`.

Returns
-------
r : ndarray or tuple of ndarray
    `r` will have the shape that the arrays in `x` broadcast to; if `out` is
    provided, it will be returned. If not, `r` will be allocated and
    may contain uninitialized values. If the function has more than one
    output, then the result will be a tuple of arrays.
```

That's as much the official docs for this object as what appears on
docs.scipy.org.

These are ufuncs. They should be ufuncs regardless of the environment
variable. If you want to change them from being ufuncs to just being
elementwise functions, go through a big deprecation where they are *never*
ufuncs regardless of environment variable (i.e. plain functions with the
docs.scipy.org signatures and just use the ufunc implementations underneath
when the Array API is `numpy`). But I suspect one can also implement a
ufunc-like override object that passes through all attribute access and
ufunc-only keyword calls to the ufunc object and calls the override
elementwise function only when it fits.

-- 
Robert Kern

_______________________________________________
SciPy-Dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/scipy-dev.python.org/
Member address: [email protected]