Создание подкласса numpy array, в котором все операции по изменению формы возвращают обычный массив - PullRequest
7 голосов
/ 29 марта 2011

У меня есть подкласс массива, где некоторые дополнительные атрибуты действительны только для исходной формы объекта. Есть ли способ сделать так, чтобы все операции по изменению формы массива возвращали обычный массив с пустыми элементами вместо экземпляра моего класса?

Я уже написал 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__ операцию создания нового шаблона (в отличие от приведения к просмотру)? Это, по крайней мере, позволило бы разыменовать некоторые атрибуты, которые копируются по ссылке. Я также мог бы установить флаг или что-то, сообщающее новому экземпляру, что его форма недействительна.

1 Ответ

1 голос
/ 04 апреля 2011

Если вы не вводите новых членов в свои экземпляры NewArrayClass, вы можете переназначить атрибут __class__ возвращенных экземпляров.

A.__class__ = np.ndarray

Дело в том, почему вы хотели бы сделать такую ​​вещь. Вы занимаетесь строгой проверкой типов в других местах? Вы бы пошли гораздо дальше с набором утки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...