我正在尝试子类化numpy
的ndarray
类,并且有一些运气。我想要的行为与文档中给出的示例几乎完全相同。我想向name
数组添加一个参数(我用它来跟踪数据最初来自哪里)。
class Template(np.ndarray):
"""A subclass of numpy's n dimensional array that allows for a
reference back to the name of the template it came from.
"""
def __new__(cls, input_array, name=None):
obj = np.asarray(input_array).view(cls)
obj.name = name
return obj
def __array_finalize__(self, obj):
if obj is None: return
self.name = getattr(obj, 'name', None)
这可行,除了像这个问题一样,我希望涉及我的子类的任何转换都返回我的子类的另一个实例。
有时 numpy 函数会返回一个实例Template
:
>>> a = Template(np.array([[1,2,3], [2,4,6]], name='from here')
>>> np.dot(a, np.array([[1,0,0],[0,1,0],[0,0,1]]))
Template([[1, 2, 3],
[2, 4, 6]])
但是,有时他们不会:
>>> np.dot(np.array([[1,0],[0,1]]), a)
array([[1, 2, 3],
[2, 4, 6]])
在我上面链接的问题中,建议 OP 应该覆盖__wrap_array__
子类的方法。但是,我认为这没有任何理由。在某些情况下,我会使用默认的__array_wrap__
. 文档似乎表明我遇到了一种情况,__array_wrap__
即由于更高的__array_priority__
值而调用了另一个参数的方法:
注意ufunc(
np.add
)调用了输入值__array_wrap__
最高的方法__array_priority__
所以我的问题有几个相关的部分。第一:我可以设置__array_priority__
我的子类的属性,使其__array_wrap__
始终被调用吗?第二:这是实现我想要的行为的最好/最简单的方法吗?