Механизм NumPy ufunc имеет встроенные хуки для настройки того, как объекты обрабатываются с помощью ufuncs.В этом конкретном случае numpy.exp
ufunc вызывает метод Series * __array__
, чтобы получить массив для работы, вычисляет экспоненту по массиву и затем вызывает __array_wrap__
* SeriesМетод 1007 * в результирующем массиве для последующей его обработки.
__array__
- это то, как ufunc получает объект, с которым он умеет работать, а __array_wrap__
- как результат преобразуется обратно в серию.вместо массива.
Вы можете увидеть те же механизмы в действии, написав свой собственный класс с помощью этих методов:
In [9]: class ArrayWrapper(object):
...: def __init__(self, arr):
...: self.arr = arr
...: def __repr__(self):
...: return 'ArrayWrapper({!r})'.format(self.arr)
...: def __array__(self):
...: return self.arr
...: def __array_wrap__(self, arr):
...: return ArrayWrapper(arr)
...:
In [10]: numpy.exp(ArrayWrapper(numpy.array([1, 2, 3])))
Out[10]: ArrayWrapper(array([ 2.71828183, 7.3890561 , 20.08553692]))