我正在尝试将 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
Run Code Online (Sandbox Code Playgroud)
这导致
information
None
Run Code Online (Sandbox Code Playgroud)
我曾两次期待“信息”。
更换线路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而不是编写容器类,因为后者会失去MaskedArrays带来的一些便利。
(注意:这与这个问题不同,因为我已经“解决”了__init__/__new__问题。)
为了让您的切片按您希望的方式工作,您可能需要重载__getitem__:
def __getitem__(self, item):
out = np.ma.MaskedArray.__getitem__(self, item)
out.info = self.info
return out
Run Code Online (Sandbox Code Playgroud)
同上__setitem__。
如果您的info属性相对简单,例如在您的示例中,您可能需要查看_optinfo的属性MaskedArray,它是为此目的而设计的:它只是一个字典,存储一些必须以某种方式保留的信息。这是一个例子:
class MyMaskedArray(np.ma.MaskedArray):
def __new__(cls, input_array, info=None):
obj = np.asarray(input_array).view(cls)
obj._optinfo['info'] = info
return obj
@property
def info(self):
return self._optinfo.get('info', None)
Run Code Online (Sandbox Code Playgroud)
请注意,这里的.info是只读属性,但使其可写很简单。
关于 __array_finalize__
我不确定我是否理解你的问题:ndarray它本身就是超类。MaskedArray是 的子类ndarray,因此需要定义一个__array_finalize__方法来特别说明如何设置掩码(通过_mask参数)。检查此链接以获取有关子类化的更多信息。
在您的示例中,您使用自己的属性__array_finalize__来设置.info属性。在这种情况下,您必须调用父方法MaskedArray.__array_finalize__,这是基本的 Python 子类化。__array_finalize__请注意,如果您这样做,则不必明确定义_optinfo...
笔记
__array_prepare__并处理函数的结果__array_wrap__ndarray| 归档时间: |
|
| 查看次数: |
573 次 |
| 最近记录: |