Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 子类化numpy.ndarray_Python_Numpy_Subclass - Fatal编程技术网

Python 子类化numpy.ndarray

Python 子类化numpy.ndarray,python,numpy,subclass,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

我想实现
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的对象?

尝试以下方法:

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

只是要确保你知道我想你想要的看法铸造,这应该在NPE的链接解释。