2014-10-09 48 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)