我有一个数组子类,其中一些额外属性仅对对象的原始形状有效。有没有办法确保所有数组形状更改操作返回一个普通的numpy数组而不是我的类的实例?
我已经编写了array_wrap,但这似乎对np.mean
,np.sum
或np.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__
中识别新的模板操作(而不是视图转换)?这至少可以让我取消引用一些通过引用复制的属性。我还可以设置一个标志或告诉新实例其形状无效的东西。
答案 0 :(得分:1)
如果您没有向NewArrayClass
个实例引入任何新成员,则可以重新分配返回实例的__class__
属性。
A.__class__ = np.ndarray
关键是你为什么要做这样的事情。你在其他地方进行严格的类型检查吗?你可以选择鸭子打字。