Я пытаюсь создать подкласс numpy
для класса ndarray
, и мне повезло. Поведение, которое я хотел бы, почти точно такое же, как в примере , приведенном в документации. Я хочу добавить параметр name
в массив (, который я использую для отслеживания того, откуда исходно пришли данные ).
class Template(np.ndarray):
"""A subclass of numpy's n dimensional array that allows for a
reference back to the name of the template it came from.
"""
def __new__(cls, input_array, name=None):
obj = np.asarray(input_array).view(cls)
obj.name = name
return obj
def __array_finalize__(self, obj):
if obj is None: return
self.name = getattr(obj, 'name', None)
Это работает, за исключением того, что, как этот вопрос , я хочу, чтобы любое преобразование, включающее мой подкласс, возвращало другой экземпляр моего подкласса .
Иногда функции numpy возвращают экземплярTemplate
:
>>> a = Template(np.array([[1,2,3], [2,4,6]], name='from here')
>>> np.dot(a, np.array([[1,0,0],[0,1,0],[0,0,1]]))
Template([[1, 2, 3],
[2, 4, 6]])
Однако иногда они этого не делают.:
>>> np.dot(np.array([[1,0],[0,1]]), a)
array([[1, 2, 3],
[2, 4, 6]])
В вопросе, на который я ссылался выше, было предложено, чтобы OP переопределяла метод __wrap_array__
для подкласса. Однако я не вижу в этом никакого оправдания. В некоторых ситуацияхЯ получаю ожидаемое поведение по умолчанию __array_wrap__
. Документы , кажется, предполагают, что я сталкиваюсь с ситуацией, когда вызывается метод __array_wrap__
другого аргумента из-за более высокого значения __array_priority__
:
Обратите внимание, что ufunc(
np.add
)вызвал метод__array_wrap__
ввод с самым высоким значением__array_priority__
Итак, мой вопрос состоит из нескольких связанных частей. Во-первых,:могу ли я установить атрибут __array_priority__
моего подкласса так, чтобы его __array_wrap__
всегда вызывался? Второй:Является ли это лучшим/простейшим способом добиться желаемого поведения?