Я пытаюсь подкласса numpy
ndarray
класс, и им повезло. Поведение, которое я хотел бы, почти точно такое же, как в файле example. Я хочу добавить к массиву параметр name
(который я использую, чтобы отслеживать, откуда взялись данные).Сохранение подкласса ndarray numpy в качестве возвращаемого значения во время преобразования. Безопасно установить __array_priority__?
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)
Это работает, за исключением того, что, как this question, Я хочу, чтобы какие-либо преобразования с участием моего подкласса вернуть еще один экземпляр моего подкласса.
Иногда 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]])
В вопросе я связан выше, было высказано предположение о том, что ОП должен переопределить метод __wrap_array__
для подкласса. Однако я не вижу в этом никаких оснований. В некоторых ситуациях я получаю ожидаемое поведение по умолчанию __array_wrap__
. The docs, кажется, предполагает, что я бег в ситуацию, где это другой аргумент __array_wrap__
метода вызывается из-за более высокое __array_priority__
значения:
Обратите внимание, что ufunc (
np.add
) назвал__array_wrap__
метод на вход с самым высоким значением__array_priority__
Таким образом, у моего вопроса есть пара связанных частей. Во-первых: Могу ли я установить атрибут __array_priority__
моего подкласса таким образом, чтобы его всегда вызывали его __array_wrap__
? Второй: Это лучший/самый простой способ добиться желаемого поведения?