class documentation

class NDArrayOperatorsMixin:

Known subclasses: numpy.lib.tests.test_mixins.ArrayLike

View In Hierarchy

Mixin defining all operator special methods using __array_ufunc__.

This class implements the special methods for almost all of Python's builtin operators defined in the operator module, including comparisons (==, >, etc.) and arithmetic (+, *, -, etc.), by deferring to the __array_ufunc__ method, which subclasses must implement.

It is useful for writing classes that do not inherit from numpy.ndarray, but that should support arithmetic and numpy universal functions like arrays as described in A Mechanism for Overriding Ufuncs.

As an trivial example, consider this implementation of an ArrayLike class that simply wraps a NumPy array and ensures that the result of any arithmetic operation is also an ArrayLike object:

class ArrayLike(np.lib.mixins.NDArrayOperatorsMixin):
    def __init__(self, value):
        self.value = np.asarray(value)

    # One might also consider adding the built-in list type to this
    # list, to support operations like np.add(array_like, list)
    _HANDLED_TYPES = (np.ndarray, numbers.Number)

    def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):
        out = kwargs.get('out', ())
        for x in inputs + out:
            # Only support operations with instances of _HANDLED_TYPES.
            # Use ArrayLike instead of type(self) for isinstance to
            # allow subclasses that don't override __array_ufunc__ to
            # handle ArrayLike objects.
            if not isinstance(x, self._HANDLED_TYPES + (ArrayLike,)):
                return NotImplemented

        # Defer to the implementation of the ufunc on unwrapped values.
        inputs = tuple(x.value if isinstance(x, ArrayLike) else x
                       for x in inputs)
        if out:
            kwargs['out'] = tuple(
                x.value if isinstance(x, ArrayLike) else x
                for x in out)
        result = getattr(ufunc, method)(*inputs, **kwargs)

        if type(result) is tuple:
            # multiple return values
            return tuple(type(self)(x) for x in result)
        elif method == 'at':
            # no return value
            return None
        else:
            # one return value
            return type(self)(result)

    def __repr__(self):
        return '%s(%r)' % (type(self).__name__, self.value)

In interactions between ArrayLike objects and numbers or numpy arrays, the result is always another ArrayLike:

>>> x = ArrayLike([1, 2, 3])
>>> x - 1
ArrayLike(array([0, 1, 2]))
>>> 1 - x
ArrayLike(array([ 0, -1, -2]))
>>> np.arange(3) - x
ArrayLike(array([-1, -1, -1]))
>>> x - np.arange(3)
ArrayLike(array([1, 1, 1]))

Note that unlike numpy.ndarray, ArrayLike does not allow operations with arbitrary, unrecognized types. This ensures that interactions with ArrayLike preserve a well-defined casting hierarchy.

New in version 1.13.
Class Variable __abs__ Undocumented
Class Variable __add__ Undocumented
Class Variable __and__ Undocumented
Class Variable __divmod__ Undocumented
Class Variable __eq__ Undocumented
Class Variable __floordiv__ Undocumented
Class Variable __ge__ Undocumented
Class Variable __gt__ Undocumented
Class Variable __iadd__ Undocumented
Class Variable __iand__ Undocumented
Class Variable __ifloordiv__ Undocumented
Class Variable __ilshift__ Undocumented
Class Variable __imatmul__ Undocumented
Class Variable __imod__ Undocumented
Class Variable __imul__ Undocumented
Class Variable __invert__ Undocumented
Class Variable __ior__ Undocumented
Class Variable __ipow__ Undocumented
Class Variable __irshift__ Undocumented
Class Variable __isub__ Undocumented
Class Variable __itruediv__ Undocumented
Class Variable __ixor__ Undocumented
Class Variable __le__ Undocumented
Class Variable __lshift__ Undocumented
Class Variable __lt__ Undocumented
Class Variable __matmul__ Undocumented
Class Variable __mod__ Undocumented
Class Variable __mul__ Undocumented
Class Variable __ne__ Undocumented
Class Variable __neg__ Undocumented
Class Variable __or__ Undocumented
Class Variable __pos__ Undocumented
Class Variable __pow__ Undocumented
Class Variable __radd__ Undocumented
Class Variable __rand__ Undocumented
Class Variable __rdivmod__ Undocumented
Class Variable __rfloordiv__ Undocumented
Class Variable __rlshift__ Undocumented
Class Variable __rmatmul__ Undocumented
Class Variable __rmod__ Undocumented
Class Variable __rmul__ Undocumented
Class Variable __ror__ Undocumented
Class Variable __rpow__ Undocumented
Class Variable __rrshift__ Undocumented
Class Variable __rshift__ Undocumented
Class Variable __rsub__ Undocumented
Class Variable __rtruediv__ Undocumented
Class Variable __rxor__ Undocumented
Class Variable __sub__ Undocumented
Class Variable __truediv__ Undocumented
Class Variable __xor__ Undocumented
__abs__ =

Undocumented

__add__ =

Undocumented

__and__ =

Undocumented

__divmod__ =

Undocumented

__eq__ =

Undocumented

__floordiv__ =

Undocumented

__ge__ =

Undocumented

__gt__ =

Undocumented

__iadd__ =

Undocumented

__iand__ =

Undocumented

__ifloordiv__ =

Undocumented

__ilshift__ =

Undocumented

__imatmul__ =

Undocumented

__imod__ =

Undocumented

__imul__ =

Undocumented

__invert__ =

Undocumented

__ior__ =

Undocumented

__ipow__ =

Undocumented

__irshift__ =

Undocumented

__isub__ =

Undocumented

__itruediv__ =

Undocumented

__ixor__ =

Undocumented

__le__ =

Undocumented

__lshift__ =

Undocumented

__lt__ =

Undocumented

__matmul__ =

Undocumented

__mod__ =

Undocumented

__mul__ =

Undocumented

__ne__ =

Undocumented

__neg__ =

Undocumented

__or__ =

Undocumented

__pos__ =

Undocumented

__pow__ =

Undocumented

__radd__ =

Undocumented

__rand__ =

Undocumented

__rdivmod__ =

Undocumented

__rfloordiv__ =

Undocumented

__rlshift__ =

Undocumented

__rmatmul__ =

Undocumented

__rmod__ =

Undocumented

__rmul__ =

Undocumented

__ror__ =

Undocumented

__rpow__ =

Undocumented

__rrshift__ =

Undocumented

__rshift__ =

Undocumented

__rsub__ =

Undocumented

__rtruediv__ =

Undocumented

__rxor__ =

Undocumented

__sub__ =

Undocumented

__truediv__ =

Undocumented

__xor__ =

Undocumented