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

时间:2011-03-29 15:16:52

标签: python numpy scipy

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

我已经编写了array_wrap,但这似乎对np.meannp.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))

我想我必须在__new____array_finalize__做一些事情,但我不知道是什么。

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

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

1 个答案:

答案 0 :(得分:1)

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

A.__class__ = np.ndarray

关键是你为什么要做这样的事情。你在其他地方进行严格的类型检查吗?你可以选择鸭子打字。