【发布时间】:2020-03-16 23:29:25
【问题描述】:
为简单起见,我们只需从 numpy 文档中复制诊断 ndarray 子类:
import numpy as np
class MySubClass(np.ndarray):
def __new__(cls, input_array, info=None):
obj = np.asarray(input_array).view(cls)
obj.info = info
return obj
def __array_finalize__(self, obj):
print('In __array_finalize__:')
print(' self is %s' % repr(self))
print(' obj is %s' % repr(obj))
if obj is None: return
self.info = getattr(obj, 'info', None)
现在我们做一个简单的例子:
>>> x = MySubClass(np.ones((1,5)))
In __array_finalize__:
self is MySubClass([[1., 1., 1., 1., 1.]])
obj is array([[1., 1., 1., 1., 1.]])
>>> y = x.T
In __array_finalize__:
self is MySubClass([[1., 1., 1., 1., 1.]])
obj is MySubClass([[1., 1., 1., 1., 1.]])
我们可以看到,显然不是转置的东西被传递给__array_finalize__。除了将“finalize”这个词的含义扩展到全新的领域之外,这种行为的目的是什么?
发送实际输出不是更有意义吗,即通过这个钩子进行转置以使其最终确定?
用我的子类可能需要的任何后处理来修饰基本转置的推荐方法是什么?
【问题讨论】:
-
要明确一点,
y仍然是x的转置,info按预期设置。在我自己的测试中,某些方法在进行更改之前显然调用了finalize(例如这个转置),但对于其他方法,self已经更改(例如索引) -
显然
finalize在创建实例时被调用(通过new/init或某种view),但之后应用了一些处理,如转置。ufunc似乎创建了正确子类、形状和 dtype 的empty,并将其用作out,在finalize之后分配值。
标签: python numpy subclassing