Как подклассьте подкласс Numpy .ndarray

Я борюсь в подкласс моего собственного подкласса Numpy.ndarray. Я не очень понимаю, в чем проблема и хотела бы, чтобы кто-то объяснить, что идет не так в следующих случаях и как делать то, что я пытаюсь сделать.

Что я пытаюсь достичь:

У меня есть подкласс numpy.narry, который ведет себя, как я хочу (класс a в коде ниже). Я хочу подкласс A (класс B в коде ниже), чтобы B содержит дополнительную информацию (имя) и методы (метод оформления .simple_data).

Случай 1:

import numpy as np

class A(np.ndarray):

    def __new__(cls,data):
        obj = np.asarray(data).view(cls)
        return obj

    def __array_finalize(self,obj):
        if obj is None: return

class B(A):

    def __init__(self,data,name):
        super(B,self).__init__(data)
        self.name = name

    @property
    def simple_data(self):
        return [data[0,:],data[:,0]]

if __name__ == '__main__':
    data = np.arange(20).reshape((4,5))
    b = B(data,'B')
    print type(b)
    print b.simple_data

Выполнение этого кода дает вывод:

Traceback (most recent call last):
  File "ndsubclass.py", line 24, in <module>
    b = B(data,'B')
TypeError: __new__() takes exactly 2 arguments (3 given)

Я предполагаю, что это связано с переменной «имени» в построении B и что из-за то, что является подклассом numpy.array, а Новый метод называется до метода B'S INIT . Таким образом, чтобы исправить это, я предполагаю, что B также нужен новый метод , который надлежащим образом обрабатывает дополнительный аргумент.

Мое предположение что-то вроде:

def __new__(cls,data,name):
    obj = A(data)
    obj.name = name
    return obj

должен сделать это, но как я могу изменить класс OBJ?

Case 2:

import numpy as np

class A(np.ndarray):

    def __new__(cls,data):
        obj = np.asarray(data).view(cls)
        return obj

    def __array_finalize__(self,obj):
        if obj is None: return

class B(A):

    def __new__(cls,data):
        obj = A(data)
        obj.view(cls)
        return obj

    def __array_finalize__(self,obj):
        if obj is None: return

    @property
    def simple_data(self):
        return [self[0,:],self[:,0]]

if __name__ == '__main__':
    data = np.arange(20).reshape((4,5))
    b = B(data)
    print type(b)
    print b.simple_data()

При запуске вывода:

<class '__main__.A'>
Traceback (most recent call last):
  File "ndsubclass.py", line 30, in <module>
    print b.simple_data()
AttributeError: 'A' object has no attribute 'simple_data'

Это удивляет меня, как я Ожидание:

<class '__main__.B'>
[array([0, 1, 2, 3, 4]), array([ 0,  5, 10, 15])]

Я предполагаю, что звонок для просмотра () в B. NEW () как-то не правильно устанавливает класс OBJ. Почему?

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

6
задан Ben Whale 8 September 2011 в 02:52
поделиться