Сохранение подкласса numpy ndarray в качестве возвращаемого значения во время преобразования. Безопасно установить __массив _приоритет __?

Я пытаюсь создать подкласс 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__всегда вызывался? Второй:Является ли это лучшим/простейшим способом добиться желаемого поведения?

6
задан Community 23 May 2017 в 12:23
поделиться