NumPy 1.14

numpy.lib.mixins.NDArrayOperatorsMixin




numpy

numpy.lib.mixins.NDArrayOperatorsMixin

class numpy.lib.mixins.NDArrayOperatorsMixin [source]

मिक्स __array_ufunc__ का उपयोग करके सभी ऑपरेटर विशेष विधियों को परिभाषित करता है।

यह वर्ग __array_ufunc__ पद्धति के __array_ufunc__ , पायथन ( == , आदि) और अंकगणितीय ( + , * , - , आदि) सहित operator मॉड्यूल में परिभाषित पायथन के लगभग सभी ऑपरेटरों के लिए विशेष विधियों को लागू करता है। जो उपवर्गों को लागू करना चाहिए।

यह वर्ग अभी तक matmul ( @ ) के अनुरूप विशेष परिचालकों को लागू नहीं करता है, क्योंकि np.matmul अभी तक एक NumPy ufunc नहीं है।

यह उन वर्गों को लिखने के लिए उपयोगी है जो numpy.ndarray से विरासत में नहीं numpy.ndarray , लेकिन यह एरीकेडिंग ओवरफाइडिंग के लिए ए मैकेनिज़्म में वर्णित अंकगणित और संख्यात्मक सार्वभौमिक कार्यों का समर्थन करना चाहिए।

एक तुच्छ उदाहरण के रूप में, एक ArrayLike वर्ग के इस कार्यान्वयन पर विचार करें जो केवल एक NumPy सरणी लपेटता है और यह सुनिश्चित करता है कि किसी भी अंकगणितीय ऑपरेशन का परिणाम भी एक ArrayLike ऑब्जेक्ट है:

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)

ArrayLike ऑब्जेक्ट्स और संख्याओं या संख्यात्मक सरणियों के बीच बातचीत में, परिणाम हमेशा एक और 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]))

ध्यान दें कि numpy.ndarray विपरीत, ArrayLike मनमाने, गैर-मान्यताप्राप्त प्रकारों के साथ संचालन की अनुमति नहीं देता है। यह सुनिश्चित करता है कि ArrayLike के साथ बातचीत एक अच्छी तरह से परिभाषित कास्टिंग पदानुक्रम को संरक्षित करती है।