2012-05-04 1 views
5

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

ответ

0

Когда два объекта имеют один и тот же __array_priority__:

>>> np.array([[1,0],[0,1]]).__array_priority__ 
0.0 
>>> a.__array_priority__ 
0.0 

И только могут быть использованы методы одного объекта, галстука решается с использованием методов первого массива/объекта. (В вашем случае __array_wrap__)

От вопроса кажется, что методы вашего класса всегда должны быть предпочтительными, поскольку они одинаковы (через наследование) или переопределены.

Так что я просто прокрутил бы __array_priority__.

class Template(np.ndarray): 
    __array_priority__ = 1.0 (Or whichever value is high enough) 
    ... 

После того, как вы сделаете это независимо от того, где объект шаблона находится в расчете. Его методы будут предпочтительнее, чем методы стандартных массивов.