У меня есть подкласс массива, где некоторые дополнительные атрибуты действительны только для исходной формы объекта. Есть ли способ сделать так, чтобы все операции по изменению формы массива возвращали обычный массив с пустыми элементами вместо экземпляра моего класса?
Я уже написал array_wrap, но, похоже, это не влияет на такие операции, как np.mean
, np.sum
или np.rollaxis
. Все они просто возвращают экземпляр моего класса.
import numpy as np
class NewArrayClass(np.ndarray):
__array_priority__ = 3.0
def __array_wrap__(self, out_arr, context=None):
if out_arr.shape == self.shape:
out = out_arr.view(new_array)
# Do a bunch of class dependant initialization and attribute copying.
# ...
return out
else:
return np.asarray(out_arr)
A = np.arange(10)
A.shape = (5, 2)
A = arr.view(NewArrayClass)
# Would like this to be np.ndarray, but get new_array_class.
print type(np.sum(A, 0))
Полагаю, мне нужно что-то сделать в __new__
или __array_finalize__
, но я понятия не имею, что.
Обновление:
После тщательного прочтения пустой документации по подклассам (http://docs.scipy.org/doc/numpy/user/basics.subclassing.html), все операции по изменению формы массива выполняют операцию «новый из шаблона». Поэтому возникает вопрос, как сделать так, чтобы операция «новый из шаблона» вместо этого возвращала экземпляры ndarray? экземпляров моего класса. Насколько я могу судить, __new__
никогда не вызывается в этих функциях.
Альтернатива:
Если предположить, что вышеупомянутое невозможно, как, по крайней мере, идентифицировать в __array_finalize__
операцию создания нового шаблона (в отличие от приведения к просмотру)? Это, по крайней мере, позволило бы разыменовать некоторые атрибуты, которые копируются по ссылке. Я также мог бы установить флаг или что-то, сообщающее новому экземпляру, что его форма недействительна.