2014-10-09 50 views
3

我想要实现的numpy.ndarray一个子类,像这样的东西覆盖的构造:子类numpy.ndarray

class mymat(numpy.ndarray): 
    def __new__(cls, n, ...): 
     ret = np.eye(n) 

     # make some modifications to ret 

     return ret 

遗憾的是,此构造返回的对象的类型不是cls,而是numpy.ndarray

设置类ret

ret.__class__ = cls # bombs: TypeError: __class__ assignment: only for heap types 

将无法​​正常工作。

一个可行的办法是这样的

class mymat(numpy.ndarray): 
    def __new__(cls, n, ...): 
     ret = super(mymat, cls).__new__(cls, (n, n)) 
     ret[:] = np.eye(n) 

     # make some modifications to ret 

     return ret 

这是适合于小n,但我宁愿避免额外的Python端分配时n大。

是否有其他方法可以避免这种额外的分配,并且仍然产生类mymat的对象?

+3

只是确保你意识到http://docs.scipy.org/doc/numpy/user/basics.subclassing.html – NPE 2014-10-09 18:19:03

+0

我想你想查看其铸造应在NPE的链接中解释。 – mgilson 2014-10-09 18:20:45

回答

4

试试这个:

class mymat(np.ndarray): 
    def __new__(cls, n): 
     ret = np.eye(n) 
     return ret.view(cls)