Я борюсь в подкласс моего собственного подкласса Numpy.ndarray. Я не очень понимаю, в чем проблема и хотела бы, чтобы кто-то объяснить, что идет не так в следующих случаях и как делать то, что я пытаюсь сделать.
У меня есть подкласс numpy.narry, который ведет себя, как я хочу (класс a в коде ниже). Я хочу подкласс A (класс B в коде ниже), чтобы B содержит дополнительную информацию (имя) и методы (метод оформления .simple_data).
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?
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. Почему?
Я запутался как к тому, что происходит, и было бы очень благодарен, если бы кто-то мог это объяснить.