我正在尝试对 numpy 进行子类化MaskedArray
以添加属性,但似乎无法获得正确的结果。
我首先按照子类化 a的示例numpy.ndarray
开始,它工作正常。
然后我尝试将 a 子类numpy.ma.MaskedArray
化,如下所示:
import numpy as np
class MyMaskedArray(np.ma.MaskedArray):
def __new__(cls, input_array, info=None):
obj = np.asarray(input_array).view(cls)
obj.info = info
return obj
def __array_finalize__(self, obj):
if obj is None: return
self.info = getattr(obj, 'info', None)
super(MyMaskedArray, self).__array_finalize__(obj)
arr = np.arange(5)
obj = MyMaskedArray(arr, info='information')
print obj.info
print obj[1:].info
这导致
information
None
我曾两次期待“信息”。
obj = np.asarray(input_array).view(cls)
用obj = np.ma.MaskedArray(input_array).view(cls)
或没有解决该问题替换该行obj = np.ma.MaskedArray.__new__(cls, input_array)
(我走这条路,因为我想通过*args
并**kwargs
在__new__
未来的子类化身中传递。)
请注意,与子类的示例相反,我还必须MaskedArray.__array_finalize
在我的子类中添加一个调用;如果我不这样做,则找不到该属性。__array_finalize__
ndarray
_mask
也许有人可以启发我:
如何
obj[1:].info
保持原件obj.info
为什么
ndarray
不需要超类调用__array_finalize__
,但MaskedArray
确实需要(更多的奖励问题)。
我想继承MaskedArray
而不是编写容器类,因为后者会失去MaskedArray
s 带来的一些便利。
(注意:这与这个问题不同,因为我已经“解决”了__init__
/__new__
问题。)