2012-10-03 41 views
1

有人问这里的问题:Subclassing numpy ndarray problem但它基本上没有答案。python numpy中的子类ndarray:更改数组的大小和值

这是我的问题版本。假设您将numpy.ndarray子类化为当您尝试将元素设置为超出当前形状之外时自动展开的内容。您需要覆盖setitem并使用一些numpy.concatenate调用来构造一个新数组,然后以某种方式将其分配给“self”。如何将数组分配给“自我”?

class myArray(numpy.ndarray): 
    def __new__(cls, input_array): 
     obj = numpy.asarray(input_array).view(cls) 
     return(obj) 

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

    try: 
     super(myArray, self).__setitem__(coords, value) 
    except IndexError as e: 
     logging.error("Adjusting array") 
     ... 
     self = new_array # THIS IS WRONG 
+0

对自己的分配似乎只是无稽之谈,你如何支持替换一个对象?此外,使用numpy数组做这样的操作会使数组视图无效。你不能用子类来做到这一点,有一个原因'ndarray.resize'是如此限制... – seberg

回答

3

为什么是子类?为什么不给你的包装对象它自己的数据成员是ndarray并使用__getitem____setitem__对包装数据成员进行操作?这基本上就是ndarray已经包装了Python的内置容器。也看看Python Pandas,它已经做了很多你在谈论的东西包裹在ndarray之上。

+1

是的,这是我目前正在做的。但是接下来我必须手动包装所有我想公开给类的ndarray(我的意思是数组)属性和函数吗?例如,我必须在类定义中实现“__repr__”。这些很简单,但我认为绕过这是子类化的一个点。也许还有另一个窍门? Python Pandas太棒了!我正试图更多地使用它。 – mathtick

+0

如果你想要底层数据的'__repr__',你应该只能调用'MyClass.data .__ repr__'。我可以想象,包装它应该只需要你为一些'ndarray'默认值做些额外的工作。你的大部分代码不应该尝试像MyClass.sum()这样的事情,而应该去做MyClass.data.sum()等等...... – ely