子类化numpy.ndarray

时间:2014-10-09 18:16:17

标签: python numpy subclass

我想实现一个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,但我希望在n较大时避免额外的Python端分配。

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

1 个答案:

答案 0 :(得分:4)

试试这个:

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