创建一个numpy数组子类,其中所有形状更改操作都返回一个普通数组

kiy*_*iyo 7 python numpy scipy

我有一个数组子类,其中一些额外的属性仅对对象的原始形状有效.有没有办法确保所有数组形状更改操作返回一个普通的numpy数组而不是我的类的实例?

我已经写array_wrap,但是这似乎并不具有像操作的任何影响np.mean,np.sumnp.rollaxis.这些只是返回我班级的一个实例.

import numpy as np    

class NewArrayClass(np.ndarray):
    __array_priority__ = 3.0
    def __array_wrap__(self, out_arr, context=None):
        if out_arr.shape == self.shape:
            out = out_arr.view(new_array)
            # Do a bunch of class dependant initialization and attribute copying.
            # ...
            return out
        else:
            return np.asarray(out_arr)

A = np.arange(10)
A.shape = (5, 2)
A = arr.view(NewArrayClass)
# Would like this to be np.ndarray, but get new_array_class.
print type(np.sum(A, 0))
Run Code Online (Sandbox Code Playgroud)

我想我必须做的东西__new__还是__array_finalize__,但我还没有什么线索.

更新: 仔细阅读子类化的numpy文档(http://docs.scipy.org/doc/numpy/user/basics.subclassing.html)后,所有数组形状更改操作都在执行"从模板新建"操作.所以问题就变成了,如何使'new from template'操作返回ndarray实例而不是我的类的实例.据我所知,__new__在这些功能中永远不会被调用.

替代方案: 假设上述情况不可能,我如何至少在__array_finalize__新模板操作中识别(与视图转换相反)?这至少可以让我取消引用一些通过引用复制的属性.我还可以设置一个标志或告诉新实例其形状无效的东西.

小智 1

如果您不向NewArrayClass实例引入任何新成员,则可以重新分配__class__返回实例的属性。

A.__class__ = np.ndarray
Run Code Online (Sandbox Code Playgroud)

关键是你为什么要做这样的事情。您是否在其他地方进行严格的类型检查?使用鸭子打字你会做得更多。