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