NumPy参考 >例行程序 >Miscellaneous routines > numpy.lib.mixins.NDArrayOperatorsMixin
numpy.lib.mixins.
NDArrayOperatorsMixin
[源代码] ¶Mixin使用__array_ufunc__定义所有运算符的特殊方法。
此类实现几乎所有中所定义Python的内建运算符的特殊方法operator
模块,包括比较(==
,>
等)和算术(+
,*
,-
等),通过延迟向__array_ufunc__
方法,该方法的子类必须实现。
这对于编写不继承自numpy.ndarray
但要支持算术和numpy通用函数(例如数组)的类很有用,如覆盖Ufuncs的机制中所述。
作为一个简单的示例,请考虑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
对象与数字或numpy数组之间的交互中,结果始终是另一个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的交互保留定义明确的转换层次结构。
1.13版中的新功能。