Давайте для простоты просто скопируем диагноз c ndarray подкласс из numpy документов:
import numpy as np
class MySubClass(np.ndarray):
def __new__(cls, input_array, info=None):
obj = np.asarray(input_array).view(cls)
obj.info = info
return obj
def __array_finalize__(self, obj):
print('In __array_finalize__:')
print(' self is %s' % repr(self))
print(' obj is %s' % repr(obj))
if obj is None: return
self.info = getattr(obj, 'info', None)
Теперь давайте сделаем простой пример:
>>> x = MySubClass(np.ones((1,5)))
In __array_finalize__:
self is MySubClass([[1., 1., 1., 1., 1.]])
obj is array([[1., 1., 1., 1., 1.]])
>>> y = x.T
In __array_finalize__:
self is MySubClass([[1., 1., 1., 1., 1.]])
obj is MySubClass([[1., 1., 1., 1., 1.]])
Как мы может видеть то, что явно не является транспонированием и передается __array_finalize__
. Помимо распространения значения слова «финализировать» на целые новые области, какова цель этого поведения?
Не имеет ли больше смысла отправлять фактический результат, то есть транспонировать через этот хук для что будет завершено?
Каков рекомендуемый способ подправить базовую транспозицию с любой постобработкой, которая может потребоваться моему подклассу?