我试图编写一个定制的numpy数组包装器,它在99%的时间内表现得像一个numpy数组,但是对于我们的特定用例有一些额外的索引功能。我想知道这种行为是否可行。
理想情况下,除了我专门覆盖的任何内容之外,我能够将该类的实例视为所有行为的属性之一。我希望能够在我的包装类上调用所有numpy函数,除了一些特定的调用。
例如:
class LabeledArray(object):
def __init__(self, array, label):
self.array = array
self.label = label
def special_thing(self):
print "I do a special thing here"
la = LabeledArray(np.zeros((5,2)), {'foo': 0, 'bar': 1})
la + 1
=>
array([[1,1,1,1,1],
[1,1,1,1,1]])
la.shape
=>
(5,2)
la.special_thing()
=>
"I do a special thing here"
基本上,我想通过一些自定义的侧面调整来保留numpy(广播等)的好处。
我确实知道我可以做la.array + 1
,但我想知道是否有办法抽象掉那一层。
谢谢!
答案 0 :(得分:1)
Numpy在subclassing上有文档。可用于实现此目的的构造示例如下:
class LabeledArray(np.ndarray):
def __new__(cls, *args, **kwargs):
return super(LabeledArray, cls).__new__(cls, *args, **kwargs)
def special_thing(self):
print('I do a special thing here')
LA = LabeledArray(shape=(2, 2), dtype=float, order='F')
LA.special_thing()
# I do a special thing here