Создание подкласса массива numpy, в котором все операции изменения формы возвращают нормальный массив

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

Я уже написал 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 __ , но я понятия не имею, что именно.

Обновить :

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

Я уже написал 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 __ , но я понятия не имею, что именно.

Обновить :

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

Я уже написал 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 __ , но я понятия не имею, что именно.

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

Я уже написал 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 __ , но я понятия не имею, что именно.

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

Я уже написал 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 __ , но я понятия не имею, что именно.

Обновить : После внимательного прочтения документации numpy по созданию подклассов ( http://docs.scipy.org/doc/numpy/user/basics.subclassing.html ) все операции изменения формы массива выполняются по принципу «новый из шаблона 'операция. Таким образом, возникает вопрос: как сделать так, чтобы операция «новое из шаблона» возвращала экземпляры ndarray вместо экземпляров моего класса. Насколько я могу судить, __ new __ никогда не вызывается в этих функциях.

Альтернатива: Предполагая, что описанное выше невозможно, как мне хотя бы определить в __ array_finalize __ новую операцию из шаблона (в отличие от литья представления)? Это, по крайней мере, позволило бы мне разыменовать некоторые атрибуты, которые копируются по ссылке. Я также мог бы установить флаг или что-то еще, сообщающее новому экземпляру, что его форма недействительна.

7
задан Eskapp 11 January 2017 в 16:30
поделиться